我在postgis中遇到st_distance函数问题。它返回错误结果 - 对于小距离,误差不大 - 10,可能是20米,但是对于更大的距离,我的结果与例如谷歌地图结果之间的差异太大 - 700米到2公里或更高。我正在使用srid = 4326.第二件事 - 也许这就是问题 - 说我到了4公里外的地方。 Postgis说它距离约0.0417 {{some_units}}。现在,我只是将结果乘以100,得到或多或少的准确结果。我可以将一些参数传递给这个函数,它会说“以千米/米为单位的返回值”吗?
PS。 postgres版本是9.0.1
答案 0 :(得分:3)
您应该使用地理数据类型。
使用geometry数据类型使用的函数,您将获得与存储数据相同的单位。在您的情况下,度数。
度数无法以任何简单的方式转换为米。为了从未投影的参考系统得到米的结果,计算需要计算在地球的椭圆体周围的“大圆”上。您正在使用的计算仅使用毕达哥拉斯定理来计算平面上的距离。
因此,PostGIS没有给出错误的结果。 您可以移动到基于仪表的空间参考系统,具体取决于您的数据是否覆盖了大区域,因此地球的四舍五入是一个问题,如果是这样,您应该使用地理数据类型而使用srid 4326。
HTH
尼克拉斯
答案 1 :(得分:1)
你应该使用你的投影,目前它是以度为单位,如果你想在仪表中使用ST_transform这样:
ST_Distance(st_transform(ST_GeometryFromText('POINT(longitude latitude)',4326),900913),st_transform(point,900913))
答案 2 :(得分:0)
你应该做西里尔所说的并转换你的几何形状以使用一个以米为单位的距离单位的srid,例如900913.将你现在得到的度数(使用srid = 4326)乘以100是不可取的。
根据您所在的位置,可能会有一个以米为单位的本地srid,它对您的位置更准确 - 例如,瑞士的SRID为21781.另请检查:http://gothos.info/tag/coordinate-systems/对于某些srids美国地区。
答案 3 :(得分:0)
详细说明尼克拉斯回答,鉴于你所有的地方都有srid 4326,你可以使用:
select st_distance(geom1::geography,geom2::geography)
获取以米为单位的距离
或者,为了更准确,将几何转换为特定区域的投影crs,如EPSG:25832 ETRS89 / UTM zone 32N:
select st_distance(st_transform(geom1,25832),st_transform(geom2,25832))
答案 4 :(得分:0)
SRID:4326 ie.WGS1984代表纬度和经度的世界坐标。所以当你想测量距离时,你必须以UTM投影。你可以参考
数据库中的spatial_ref_sys
表,以查看哪个SRID使用哪个单元。 要测量你将它投影到UTM。你可以使用utmzone函数找到所需的utm区域。然后你可以使用下面的查询。
select st_distance(st_transform(geom1,utmzone(geom1)),st_transform(geom2,utmzone(geom2)))
答案 5 :(得分:0)
如果您有数据,那么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