ST_Transform 和 CoordTransform 之间的不同计算涉及预位

Posted

技术标签:

【中文标题】ST_Transform 和 CoordTransform 之间的不同计算涉及预位【英文标题】:Different calculations between ST_Transform and CoordTransform that involves presition 【发布时间】:2013-07-18 03:34:06 【问题描述】:

我正在使用 GeoDjango 和 Postgis,并在从 4326 到 24877 的点上进行转换,当我检查结果时,结果不一样

我的价值观是:

Latitude -16.42238172128686
Longitude -71.47541752550751

使用 long lat 作为 x,y 坐标

In [63]: pnt = Point(-71.47541752550751, -16.42238172128686, srid=4326)
In [64]: pnt.transform(CoordTransform(SpatialReference(4326), SpatialReference(24877)))
In [65]: pnt.x, pnt.y, pnt.srid
Out[65]: (1521142.247877425, 8160547.8770980425, 24877)

逆向

In [66]: pnt = Point( 1521142.247877425,8160547.8770980425, srid=24877 )
In [67]: pnt.transform(CoordTransform(SpatialReference(24877), SpatialReference(4326)))
In [68]: pnt.x, pnt.y, pnt.srid
Out[68]: (-71.47541753138003, -16.42238165040434, 4326)

Postgres 上的 SQL

SELECT ST_AsText(ST_Transform(ST_SetSRID(ST_MakePoint(-71.47541752550751, -16.42238172128686), 4326),24877))

POINT(1520903.86571082 8160169.90886929)

从 postgis 结果中获取数据

In [69]: pgs = Point(1520903.86571082, 8160169.90886929, srid=24877)
In [70]: pgs.transform(CoordTransform(SpatialReference(24877), SpatialReference(4326)))
In [71]: pgs.x, pnt.y, pgs.srid
Out[71]: (-71.47745375612124, -16.42238165040434, 4326)

正如您所见,geodjango 和 postgres 之间存在至少 300 米的差异,这意味着不同的地方

在一些论坛和聊天中阅读并询问后,我发现这与presition有关,我在互联网上询问了更多关于这个问题的信息,作为这个话题的新手,这得到了一些听说。

我正在寻找能够为我提供足够知识以继续工作的信息,例如:

    这样做的正确方法 造成这种差异的原因 系统之间的差异是多少米或计算该差异的正确方法 如何验证此职位 这些信息的最佳工作方式是什么

【问题讨论】:

正确的坐标轴顺序是经度/纬度,即:x=经度,y=纬度。此外,哪个 SRID? 28477 还是 24877SELECT postgis_full_version() 返回什么? 感谢您的回答,这是一个类型写入错误,我正在寻找的 srid 是 24877 【参考方案1】:

如果您查看http://spatialreference.org/ref/epsg/24877/,您会发现 EPSG 24877 仅在 -84.0000、-10.4000、-78.0000、0.0000 之间有效,而您尝试转换的点不在此范围内(-71.475 不在此范围内-84,-78 和 -16.422 不在 -10.4,0)

如果从 WGS84 转换到 PSAD56,则可能是次要问题。那里涉及网格转移。除非您有一些已经在 PSAD56 中的数据,否则我建议 WGS 84 / UTM zone 19S (EPSG:32719) 的范围为 -72.0000、-80.0000、-66.0000、0.0000。

如果您绝对需要 PSAD56,您可能会更幸运地使用 PSAD56 / UTM zone 19S (EPSG:24879),但仍然可能存在网格偏移问题。

【讨论】:

【参考方案2】:

csotelo:你已经转换了纬度/经度,那个点似乎在 24877 中不存在

>>> p = Point(-16.42238172128686,-71.47541752550751, srid=4326)
>>> p.transform(24877)
>>> print p
POINT (2388367.8123248801566660 916017.4938517492264509)

# SELECT ST_AsText(ST_Transform(ST_SetSRID(ST_MakePoint(-16.42238172128686,-71.47541752550751), 4326),24877));
                st_astext                 
------------------------------------------
 POINT(2388367.81232488 916017.493851751)

Point(-71.47541752550751, -16.42238172128686, srid=4326) 在 24877 定义的区域之外,因此只能近似。你会发现那个点实际上就在南极洲附近。 https://maps.google.nl/maps?q=-71.47541752550751,+-16.42238172128686&hl=en&ll=-71.475417,-16.422382&spn=60.209188,270.527344&sll=53.157645,5.636521&sspn=1.462449,4.22699&t=m&z=3

【讨论】:

对不起,我虽然你没有很好地阅读我的问题,因为你已经切换了点,我的纬度/经度是 -16.42238172128686,-71.47541752550751,srid=4326,根据投影文档,x 是经度,y 是纬度,然后当你在 proyections 工作时,你使用 Point(-71.47541752550751, -16.42238172128686, srid=4326),并在 django 和 postgis 上进行,有所不同,差别不大,但我正在寻找原因那,阅读它,我发现原因是用于计算的轴,原因只是一个近似值而不是一个精确点

以上是关于ST_Transform 和 CoordTransform 之间的不同计算涉及预位的主要内容,如果未能解决你的问题,请参考以下文章

在 PostGIS / PostgreSQL 中使用 st_transform 从质心坐标创建新列

(lat, lon) WKT 坐标不能用 st_transform 很好地重新投影

postgis函数

合并重复的多边形对

PostGIS 查询耗时过长。 >400ms

PG+PostGIS 空间函数查询