• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    postgresql 计算两点距离的2种方法小结

    postgresql计算两点距离

    下面两种方法:

    select 
    ST_Distance(
     ST_SetSRID(ST_MakePoint(115.97166453999147,28.716493914230423),4326)::geography,
     ST_SetSRID(ST_MakePoint(106.00231199774656,29.719258550486572),4326)::geography
    ),
    ST_Length(
     ST_MakeLine(
     ST_MakePoint(115.97166453999147,28.716493914230423),
     ST_MakePoint(106.00231199774656,29.719258550486572)
     )::geography
    )

    备注:

    ST_GeomFromText('LINESTRING(115.97166453999147 28.716493914230423,106.00231199774656 29.719258550486572)')与
    ST_MakeLine(
    	ST_MakePoint(115.97166453999147,28.716493914230423),
    	ST_MakePoint(106.00231199774656,29.719258550486572)
    )等价
     
    ST_GeomFromText('POINT(115.97166453999147 28.716493914230423)',4326)与
    ST_SetSRID(ST_MakePoint(115.97166453999147,28.716493914230423),4326)等价
     
    ST_SetSRID(ST_MakePoint(115.97166453999147,28.716493914230423),4326)::geography与
    Geography(ST_SetSRID(ST_MakePoint(115.97166453999147,28.716493914230423),4326))、
    ST_GeographyFromText('SRID=4326;POINT(115.97166453999147 28.716493914230423)')等价
    (::geography是postgis中的转换类型语法,把geometry转成geography)

    补充:postgresql计算两点欧式距离(经纬度地理位置)

    我就废话不多说了,大家还是直接看代码吧~

    create or replace function getdistance
    ( 
     lon1 numeric,
     lat1 numeric, 
     lon2 numeric, 
     lat2 numeric 
    ) 
    returns int 
    as 
    $body$ 
    declare 
    v_distance numeric;
    v_earth_radius numeric;
    radLat1 numeric;
    radLat2 numeric;
    v_radlatdiff numeric;
    v_radlngdiff numeric;
    begin 
     --地球半径
     v_earth_radius:=6378137;
      
     radLat1 := lat1 * pi()/180.0;
     radLat2 := lat2 * pi()/180.0;
     v_radlatdiff := radLat1 - radLat2;
     v_radlngdiff := lon1 * pi()/180.0 - lon2 * pi()/180.0; 
     v_distance := 2 * asin(sqrt(power(sin(v_radlatdiff / 2), 2) + cos(radLat1) * cos(radLat2) * power(sin(v_radlngdiff/2),2)));
     v_distance := round(v_distance * v_earth_radius);
     return v_distance; 
    end;
    $body$
    language 'plpgsql' volatile;
    create or replace function getdistance
    ( 
     i_lngbegin real,
     i_latbegin real, 
     i_lngend real, 
     i_latend real 
    ) 
    returns float 
    as 
    $body$
    /*
     * 
     * select getdistance_bygispoint(116.281524,39.957202,117.648673,38.42584) as distance;
     * */ 
    declare 
    v_distance real;
    v_earth_radius real;
    v_radlatbegin real;
    v_radlatend real;
    v_radlatdiff real;
    v_radlngdiff real;
    begin 
     --地球半径
     v_earth_radius:=6378.137;
      
     v_radlatbegin := i_latbegin * pi()/180.0;
     v_radlatend := i_latend * pi()/180.0;
     v_radlatdiff := v_radlatbegin - v_radlatend;
     v_radlngdiff := i_lngbegin * pi()/180.0 - i_lngend * pi()/180.0; 
     v_distance := 2 * asin(sqrt(power(sin(v_radlatdiff / 2), 2) + cos(v_radlatbegin) * cos(v_radlatend) * power(sin(v_radlngdiff/2),2)));
     v_distance := v_distance * v_earth_radius*1000; 
     return v_distance; 
    end;
    $body$ 
    language 'plpgsql' volatile;

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • PostgreSQL 慢查询SQL跟踪操作
    • CentOS PostgreSQL 12 主从复制(主从切换)操作
    • PostgreSQL 查看表的主外键等约束关系详解
    • PostgreSQL 修改视图的操作
    • PostgreSQL 更新视图脚本的注意事项说明
    • postgreSQL中的row_number() 与distinct用法说明
    • Postgresql 动态统计某一列的某一值出现的次数实例
    • 浅谈pg_hint_plan定制执行计划
    上一篇:postgreSQL查询结果添加一个额外的自增序列操作
    下一篇:Postgresql 动态统计某一列的某一值出现的次数实例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    postgresql 计算两点距离的2种方法小结 postgresql,计算,两点,距离,