Postgis - st_distance

3
我在使用postgis的st_distance函数时遇到了问题。它返回了错误的结果-对于小距离,误差不大,可能是10或20米,但对于更大的距离,我的结果与例如谷歌地图的结果之间的差异太大了,高达700米甚至2公里以上。我正在使用srid = 4326。另外一件事-也许这就是问题所在-假设我有一个距离4公里的地方。Postgis说它离我约0.0417{{some_units}}远。现在我只是将结果乘以100,得到更准确的结果。我能否传递一些参数给这个函数,告诉它“以千米/米为单位返回值”? ps. postgres版本是9.0.1

根据PostGIS文档,如果没有另行设置,默认单位为米。 - Rufinus
@Rufinus,对于地理数据类型来说是正确的,但似乎他正在使用几何数据类型。那么返回的单位与数据存储的单位相同。 - Nicklas Avén
6个回答

3
你应该使用地理数据类型。
使用几何数据类型的函数会返回与存储数据相同的单位。在你的情况下是度数。
度数不能以任何简单的方式转换为米。要从未投影的参考系统中以米为单位获取结果,需要计算围绕地球椭球体的“大圆”上的距离。你正在使用勾股定理在平面上计算距离。
因此,PostGIS没有给出错误的结果。如果你的数据涵盖了如此大的区域以至于地球的舍入成为一个问题,那么你可以转移到基于米的空间参考系统,而不是使用几何数据类型,而是使用srid 4326的地理数据类型。
希望对你有所帮助。
Nicklas

1

你应该使用投影,目前是以度为单位,如果想要以米为单位,请使用ST_transform,如下所示:

    ST_Distance(st_transform(ST_GeometryFromText('POINT(longitude     latitude)',4326),900913),st_transform(point,900913)) 

0

SRID:4326即WGS1984用于表示纬度和经度的世界坐标系。因此,当您想要测量距离时,必须投影到UTM中。您可以参考数据库中的

spatial_ref_sys

表格以查看哪个SRID使用哪个单位。要进行测量,请将其投影到UTM中。您可以使用utmzone函数找到所需的UTM区域,然后可以使用以下查询。

select st_distance(st_transform(geom1,utmzone(geom1)),st_transform(geom2,utmzone(geom2)))

0

你应该按照 Cyril 的建议,将你的几何图形转换为使用以米为单位的 SRID,例如 900913。目前使用 SRID=4326 得到的度数乘以 100 并不是正确的方法。

根据你所在的位置,可能有一个更准确的本地 SRID(以米为单位),例如瑞士的 SRID 是 21781。也可以查看此链接 http://gothos.info/tag/coordinate-systems/,了解一些美国地区的 SRID。


0
详细说明Nicklas的答案,假设你所有的几何图形都有SRID 4326,你可以使用以下代码:
select st_distance(geom1::geography,geom2::geography)

获取距离(单位:米)

或者,为了更准确,将几何图形转换为区域特定的投影坐标系,例如EPSG:25832 ETRS89 / UTM 32N带:

select st_distance(st_transform(geom1,25832),st_transform(geom2,25832))

0
如果您的数据是几何图形答案,则使用sal是很好的选择。如果您的数据是纬度和经度,请尝试以下方法:
select st_distance(point1,point2) from 
(SELECT ST_GeogFromText('SRID=4326;POINT(0 0)') point1,  
ST_GeogFromText('SRID=4326;POINT(0.25 0.4)') point2) a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接