【发布时间】:2020-04-10 06:54:48
【问题描述】:
当纬度和经度在表格中的两个单独列中时,如何计算两点之间的距离?
我无法使用 PostGIS,因为我使用的是 heroku Postgres 免费版。
【问题讨论】:
-
你能用earthdistance扩展吗?
当纬度和经度在表格中的两个单独列中时,如何计算两点之间的距离?
我无法使用 PostGIS,因为我使用的是 heroku Postgres 免费版。
【问题讨论】:
我找到了一个可以帮助你的函数。
字体: geodatasource
传递给函数:
lat1, lon1 = 点 1 的纬度和经度(十进制度)
lat2, lon2 = 点 2 的纬度和经度(十进制度)
单位 = 您希望获得结果的单位
其中:“M”是法定里程(默认)
“K”是公里
“N”是海里
CREATE OR REPLACE FUNCTION calculate_distance(lat1 float, lon1 float, lat2 float, lon2 float, units varchar)
RETURNS float AS $dist$
DECLARE
dist float = 0;
radlat1 float;
radlat2 float;
theta float;
radtheta float;
BEGIN
IF lat1 = lat2 OR lon1 = lon2
THEN RETURN dist;
ELSE
radlat1 = pi() * lat1 / 180;
radlat2 = pi() * lat2 / 180;
theta = lon1 - lon2;
radtheta = pi() * theta / 180;
dist = sin(radlat1) * sin(radlat2) + cos(radlat1) * cos(radlat2) * cos(radtheta);
IF dist > 1 THEN dist = 1; END IF;
dist = acos(dist);
dist = dist * 180 / pi();
dist = dist * 60 * 1.1515;
IF units = 'K' THEN dist = dist * 1.609344; END IF;
IF units = 'N' THEN dist = dist * 0.8684; END IF;
RETURN dist;
END IF;
END;
$dist$ LANGUAGE plpgsql;
你可以像下面这样使用:
SELECT calculate_distance(32.9697, -96.80322, 29.46786, -98.53506, 'M');
SELECT calculate_distance(32.9697, -96.80322, 29.46786, -98.53506, 'K');
SELECT calculate_distance(32.9697, -96.80322, 29.46786, -98.53506, 'N');
【讨论】:
你可以这样使用:
select SQRT(POW(69.1 * (latitude::float - p_lat::float), 2) +
POW(69.1 * (p_lon::float - longitude::float) * COS(latitude::float / 57.3), 2)
)
在这个:
(latitude, Longitude) 第 1 点。
(p_lat, p_lon) 第 2 点
【讨论】: