PostGis 根据经纬度查询两点之间距离

复制代码
-- 创建几何表
CREATE table geometry_table(
  gid serial primary key,
  name varchar,
  geom geometry(geometry,4326)
);

-- 查询当前数据库中所有空间数据表的描述信息
select * from geometry_columns

-- 查询几何表
select * from geometry_table;

-- 插入测试数据
INSERT INTO geometry_table(name,geom) VALUES ('万兴大厦','SRID=4326;POINT(101.75882888992 36.62314533104)');
INSERT INTO geometry_table(name,geom) VALUES ('水电大厦-停车场','SRID=4326;POINT(101.75228040708 36.628532886857)');
INSERT INTO geometry_table(name,geom) VALUES ('南山电影院','SRID=4326;POINT(101.77041344989 36.604966696412)');
INSERT INTO geometry_table(name,geom) VALUES ('西宁相逢居公寓','SRID=4326;POINT(101.75069496423 36.60689423054)');
INSERT INTO geometry_table(name,geom) VALUES ('青海省能源局','SRID=4326;POINT(101.75286993103 36.63663989707)');
INSERT INTO geometry_table(name,geom) VALUES ('黄河路3号院','SRID=4326;POINT(101.77662983858 36.630259065492)');


-- 使用标准的PostGIS笛卡尔平面坐标系空间函数ST_Distance(geometry, geometry)计算洛杉矶和巴黎之间的距离。请注意,SRID 4326声明了地理空间参考系统。
-- 查询结果:121!但那是什么意思?
-- 空间参考4326的单位是度,所以我们的答案是121度。但是,这表示什么呢?
-- 在地球球体上,1度对应的地球实际距离的大小是变化的。当远离赤道时,它会变得更小,当越接近两极时,地球上的经线相互之间越来越接近。因此,121度的距离并不意味着什么,这是一个没有意义的数字。
-- 为了计算出真实的距离,我们不能把地理坐标近似的看成笛卡尔平面坐标,而应该把它们看成是球坐标。我们必须把点之间的距离作为球面上的真实路径来测量——大圆的一部分。
select ST_Distance(st_geomFromText('POINT(-118.4079 33.9434)',4326),st_geomFromText('POINT(2.3490 48.8533)',4326)) 

-- 关于上面的测量应该使用geography而不是geometry类型,让我们再次尝试测量洛杉矶和巴黎之间的距离,我们将使用ST_GeographyFromText(text)函数,而不是ST_GeometryFromText(text)。
-- 查询结果:9125.75237394223 千米
select ST_Distance(ST_GeographyFromText('POINT(-118.4079 33.9434)'),ST_GeographyFromText('POINT(2.3490 48.8533)')) / 1000

-- 查询两点之间距离,单位是米。(万兴大厦 和 南山电影院之间距离)
select ST_Distance(ST_GeographyFromText('POINT(101.75882888992 36.62314533104)'),ST_GeographyFromText('POINT(101.77041344989 36.604966696412)')) 

-- 以【万兴大厦】为中心,查询其它地点距离。
select *, ST_Distance(ST_GeographyFromText('POINT(101.75882888992 36.62314533104)'),ST_GeographyFromText(ST_AsText(geom))) from geometry_table;

-- 查询距离【万兴大厦】小于1800米的数据。
select
    *,
    ST_Distance(ST_GeographyFromText('POINT(101.75882888992 36.62314533104)'),
    ST_GeographyFromText(ST_AsText(geom))) as distance
from
    geometry_table
where
    ST_Distance(ST_GeographyFromText('POINT(101.75882888992 36.62314533104)'),
    ST_GeographyFromText(ST_AsText(geom))) < 1800;
复制代码
posted @   我命由我不由天—hao  阅读(722)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
历史上的今天:
2020-12-09 ElasticSerach7.6.0拼音分词器安装和使用
2020-12-09 CentOS7安装GeoServer
点击右上角即可分享
微信分享提示