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;
原文地址:https://www.cnblogs.com/haolb123/p/15667580.html