【问题标题】:PostgreSQL calculate distance between two points without using PostGISPostgreSQL 在不使用 PostGIS 的情况下计算两点之间的距离
【发布时间】:2020-04-10 06:54:48
【问题描述】:

当纬度和经度在表格中的两个单独列中时,如何计算两点之间的距离?
我无法使用 PostGIS,因为我使用的是 heroku Postgres 免费版。

【问题讨论】:

标签: postgresql geolocation


【解决方案1】:

我找到了一个可以帮助你的函数。

字体: 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');

【讨论】:

    【解决方案2】:

    你可以这样使用:

    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 点

    【讨论】:

    • 它可以工作,但我认为它以英里为单位给出距离我们可以以公里为单位获得距离吗?
    • 是的,如果你在最后计算,你可以,但我发布了一个已经这样做的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多