Php Postgis-st_距离

Php Postgis-st_距离,php,postgis,Php,Postgis,我对postgis中的st_距离函数有问题。它返回错误的结果-对于较小的距离,误差不大-10米,也许20米,但是对于较大的距离,我的结果和谷歌地图结果之间的差异太大-700米到2公里甚至更高。我使用的是srid=4326。第二件事——也许这就是问题所在——假设我有一个4公里远的地方。波斯特吉斯说它距离约0.0417{{几个单位}。现在我只是将结果乘以100,得到或多或少的精确结果。我能给这个函数传递一些参数吗,它会说“返回值以公里/米为单位” ps.postgres版本是9.0.1您应该使用地理

我对postgis中的st_距离函数有问题。它返回错误的结果-对于较小的距离,误差不大-10米,也许20米,但是对于较大的距离,我的结果和谷歌地图结果之间的差异太大-700米到2公里甚至更高。我使用的是srid=4326。第二件事——也许这就是问题所在——假设我有一个4公里远的地方。波斯特吉斯说它距离约0.0417{{几个单位}。现在我只是将结果乘以100,得到或多或少的精确结果。我能给这个函数传递一些参数吗,它会说“返回值以公里/米为单位”


ps.postgres版本是9.0.1

您应该使用地理数据类型

使用几何数据类型使用的函数,您将获得与存储在中的数据相同的单位。就你的情况而言,你需要学位

度不能以任何简单的方式转换为米。要从未投影的参考系中获得以米为单位的结果,计算需要在地球表面的“大圆”上进行计算。你所用的计算方法就是用毕达哥拉斯定理来计算平面上的距离

因此,PostGIS不会给出错误的结果。 您可以移动到基于米的空间参考系统,这取决于您的数据是否覆盖了那么大的区域,因此地球的圆度是一个问题,如果是这样,您应该使用地理数据类型,而使用SRID4326


Nicklas

你应该使用你的投影,如果你想在米中使用ST_变换,现在它是以度为单位的:

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

您应该按照cyril所说的做,并将几何体转换为使用距离单位为米的srid,例如900913。用现在得到的度数(使用srid=4326)乘以100不是一个好办法


根据您所在的位置,可能会有一个本地srid(以米为单位),该srid对您的位置更准确——例如,瑞士的srid为21781。也请检查此项:对于美国地区的一些srid。

详细说明Nicklas的答案,鉴于您所有的Geom都有srid 4326,您可以使用:

select st_distance(geom1::geography,geom2::geography)
以米为单位计算距离

或者,更准确地说,将几何图形转换为特定于区域的投影CR,如EPSG:25832 ETRS89/UTM区域32N:

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

SRID:4326 ie.WGS1984是以经纬度表示世界坐标。因此,当你想测量距离时,你必须以UTM投影。你可以参考

空间参考系统

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

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

如果您有数据作为geom,sal的答案是好的。如果数据为lat long,请尝试以下操作:

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

根据postgis文档,如果没有其他设置,默认单位是米。@Rufinus,这对于地理数据类型是正确的,但似乎他使用的是几何数据类型。返回的单位与存储的数据相同。