首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PostgreSQL纬度经度查询

PostgreSQL纬度经度查询
EN

Stack Overflow用户
提问于 2012-04-06 03:16:26
回答 4查看 36.2K关注 0票数 32

我在PostgreSQL数据库的location表中有latitudelongitude列,我正在尝试使用PostgreSQL函数执行距离查询。

我读了手册的这一章:

https://www.postgresql.org/docs/current/static/earthdistance.html

但我想我漏掉了一些东西。

我该怎么做呢?还有没有更多的例子

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-06 03:37:53

此模块是可选的,不会在默认的PostgreSQL安装中安装。您必须从contrib目录安装它。

您可以使用以下函数来计算坐标之间的近似距离(以英里为单位):

 CREATE OR REPLACE FUNCTION distance(lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT) RETURNS FLOAT AS $$
DECLARE                                                   
    x float = 69.1 * (lat2 - lat1);                           
    y float = 69.1 * (lon2 - lon1) * cos(lat1 / 57.3);        
BEGIN                                                     
    RETURN sqrt(x * x + y * y);                               
END  
$$ LANGUAGE plpgsql;
票数 27
EN

Stack Overflow用户

发布于 2017-03-22 02:27:18

@strkol答案的一个更准确的版本,使用Haversine formula

CREATE OR REPLACE FUNCTION distance(
    lat1 double precision,
    lon1 double precision,
    lat2 double precision,
    lon2 double precision)
  RETURNS double precision AS
$BODY$
DECLARE
    R integer = 6371e3; -- Meters
    rad double precision = 0.01745329252;

    φ1 double precision = lat1 * rad;
    φ2 double precision = lat2 * rad;
    Δφ double precision = (lat2-lat1) * rad;
    Δλ double precision = (lon2-lon1) * rad;

    a double precision = sin(Δφ/2) * sin(Δφ/2) + cos(φ1) * cos(φ2) * sin(Δλ/2) * sin(Δλ/2);
    c double precision = 2 * atan2(sqrt(a), sqrt(1-a));    
BEGIN                                                     
    RETURN R * c;        
END  
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

输入以度为单位(例如52.34273489、6.23847),输出以米为单位。

票数 10
EN

Stack Overflow用户

发布于 2012-04-06 04:10:39

假设您已经正确安装了地球距离模块,这将为您提供两个城市之间的距离。此方法使用更简单的基于点的地球距离。请注意,point()的参数首先是经度,然后是纬度。

create table lat_lon (
  city varchar(50) primary key,
  lat float8 not null,
  lon float8 not null
);

insert into lat_lon values
('London, GB', 51.67234320, 0.14787970),
('New York, NY', 40.91524130, -73.7002720);

select 
  (
  (select point(lon,lat) from lat_lon where city = 'London, GB') <@>
  (select point(lon,lat) from lat_lon where city = 'New York, NY')
  ) as distance_miles

distance_miles
--
3447.58672105301
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10034636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档