-- 创建几何表 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;