ST_Transform和Coord Transform之间的不同计算涉及精度

时间:2013-07-19 00:09:22

标签: django postgresql postgresql-9.1 postgis geodjango

我正在使用GeoDjango和Postgis,并在4326到24877之间进行转换,当我检查结果时,它是不一样的

我的价值观是:

Latitude -16.42238172128686
Longitude -71.47541752550751

Initial position

将long lat用作x,y coord

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)

Position after calculus

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)

Image on sql results

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

在阅读并询问一些论坛和聊天后,我发现这与预定有关,我在互联网上询问更多关于它的问题,作为这个主题的新手,这是有些听到的。

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

  1. 正确的方法
  2. 造成这种差异的原因
  3. 系统之间的差异或计算
  4. 的正确方式是多少米
  5. 如何验证此职位
  6. 处理此信息的最佳方式是什么

2 个答案:

答案 0 :(得分:3)

如果查看http://spatialreference.org/ref/epsg/24877/,您可以看到EPSG 24877仅在-84.0000,-10.4000,-78.0000,0.0000之间有效,并且您尝试转换的点超出了该范围(-71.475 isn' -84,-78和-16.422之间的t不在-10.4,0之内

第二个问题可能是从WGS84到PSAD56的转换。那里有一个网格转移。除非你有一些已经在PSAD56中的数据,否则我建议使用WGS 84 / UTM 19S(EPSG:32719),其界限为-72.0000,-80.0000,-66.0000,0.0000。

如果您绝对需要PSAD56,PSAD56 / UTM 19S区(EPSG:24879)可能会有更多运气,但仍可能出现电网转换问题。

答案 1 :(得分: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)

点(-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