【问题标题】:How is postgis treating coordinates sent with different SRIDpostgis 如何处理使用不同 SRID 发送的坐标
【发布时间】:2021-05-20 05:18:43
【问题描述】:

我正在运行一个 django 应用程序,并且我正在为我的数据库使用 PostGis 扩展。我试图更好地理解当我发送坐标时会发生什么,特别是因为我正在使用不同的坐标系,这些坐标系转换为不同的 SRID。我的问题有三个:

  1. 在数据库中创建点或多边形时,django/postgis 是否处理转换。
  2. 我可以使用不同的 SRID 查询吗
  3. 是否建议使用默认的 SRID=4326

假设我有一个这样的模型(注意我设置的是标准 SRID=4326):

class MyModel(models.Model):

    name = models.CharField(
        max_length=120,
    )
    point = models.PointField(
        srid=4326,
    )
    polygon = models.PolygonField(
        srid=4326,
    )
  1. 现在我正在发送具有不同 SRIDS 的不同坐标和多边形。

我在这里阅读 django 文档:

此外,如果 GEOSGeometry 位于与字段不同的坐标系中(具有不同的 SRID 值),则使用空间数据库的转换程序将其隐式转换为模型字段的 SRID

所以如果我理解正确,这意味着当我发送这样的 API 请求时:

data = {
   "name": "name"
   "point": "SRID=2345;POLYGON ((12.223242267 280.123144553))"
   "polygon": "SRID=5432;POLYGON ((133.2345662 214.1429138285, 123.324244572 173.755820912250072))"

}

response = requests.request("post", url=url, data=data)

多边形和点都将正确转换为 SRID=4326??

编辑:

当我用SRID=25832;POINT (11.061859 49.460983) 发送一个点时,我会从数据库中得到'SRID=4326;POINT (11.061859 49.460983)'。当我发送带有'SRID=25832;POLYGON ((123.2796155732267 284.1831980485285, ' '127.9249715130572 273.7782091450072, 142.2351651215613 ' '280.3825718937042, 137.558146278483 290.279508688337, ' '123.2796155732267 284.1831980485285))' 的多边形时,我会从数据库中得到一个多边形'SRID=4326;POLYGON ((4.512360573651161 0.002563158966576373, ' '4.512402191765552 0.002469312460126783, 4.512530396754145 ' '0.002528880231016955, 4.512488494972807 0.00261814442892858, ' '4.512360573651161 0.002563158966576373))'

  1. 我可以使用不同的 SRID 查询吗

不幸的是,我还没有找到将相同点查询回其原始 SRID 的方法。这甚至可能吗?

  1. 最后,我主要处理欧洲的坐标,但我也可能不得不包含来自世界各地的零星坐标。 SRID=4326 是一个很好的标准吗?

非常感谢您提前提供的所有帮助。真的很感激。

【问题讨论】:

  • 您好!由于我对 djang 一无所知,我将从 GIS 的角度发表评论:对于您的问题:“多边形和点都将正确转换为 SRID=4326??”您是否尝试过脚本并在 PostgreSQL 中检查了坐标存储在哪个 SRS 中?尝试使用 ST_AsEWKT。并且“我可以使用不同的 SRID 查询它吗”:是的,您可以使用 ST_Transform 来解决这个问题。 “是否建议使用默认的 SRID=4326” WGS84 是最常用的 SRS,所以我倾向于说是的,但这完全取决于您的用例。也许您所覆盖的区域需要不同的 SRS
  • 谢谢@JimJones。是的,我已经检查过了,它使用SRID4326 保存。但我不知道它是否也能正确转换。例如,如果我发送一个点 POINT (11.061859 49.460983),我会从具有不同 SRID 的数据库中获得相同的值。当我发送一个多边形时,我得到不同 SRID 的不同值(我编辑了我的问题)
  • 在转换后,两个参考系统不太可能在同一个地方得到相同的坐标,所以我相信你的怀疑可能是有道理的:SRS 只是被改变了,但没有转换正在执行。您是否尝试过将它们绘制到地图上以查看它们是否仍然对应于同一个地方,例如使用 pgAdmin IV 的几何查看器?
  • ahhhh 但是等等,抱歉...该点没有正确写入数据库...。现在它确实给了我一个不同的值。现在我很确定它实际上正在正确转换(如果你想在你的答案中包含它)

标签: django postgresql django-rest-framework postgis srid


【解决方案1】:

首先,我不是 GIS 方面的专家(我在 Django 和 GIS 中只创建了一些小东西),但是... 在这个关于 GeoDjango 的文档中:https://docs.djangoproject.com/en/3.1/ref/contrib/gis/tutorial/#automatic-spatial-transformations。根据它:

在进行空间查询时,如果几何图形位于不同的坐标系中,GeoDjango 会自动转换它们。 ...

在控制台尝试(./manage.py shell):

from <yourapp>.models import MyModel
obj1 = MyModel.objects.all().first()
print(obj1)
print(obj1.point)
print(dir(obj1.point))
print(obj1.point.srid)

--编辑-- 您可以手动测试与此页面类似的 SRID 之间的转换:https://gis.stackexchange.com/questions/94640/geodjango-transform-not-working

obj1.point.transform(<new-srid>)

【讨论】:

  • 感谢您的帮助。好吧,print(obj1.point.srid) 给了我 SRID 4326。但我仍然不能 100% 确定这是否正确转换。我假设是这样。我只是感到困惑,因为正如我在编辑中解释的那样,POINT 返回不同的值,而 POLYGON 在创建前后返回不同的值....
【解决方案2】:

转换几何的 SRS 不仅仅是更改其 SRID。因此,如果由于某种原因在变换后坐标返回完全相同的值,则很可能根本没有变换。

此示例使用ST_Transform 将几何从25832 转换为4326。自己查看结果:

WITH j (geom) AS (
 VALUES('SRID=25832;POINT (11.061 49.463)'::geometry))
SELECT ST_AsEWKT(geom),ST_AsEWKT(ST_Transform(geom,4326)) FROM j;

 

       st_asewkt            |                      st_asewkt                       
---------------------------------+------------------------------------------------------
 SRID=25832;POINT(11.061 49.463) | SRID=4326;POINT(4.511355210946569 0.000446125446657)
(1 Zeile)
  • 您问题中的多边形转换是正确的。

确保 django 确实存储了您提到的值。发送25832几何,直接查看数据库中的SRS。如果您仅使用 django 进行检查,则可能是它在请求中再次将坐标转换回,这可能说明您没有看到任何差异。

你的问题:

SRID=4326 是一个好用的标准吗?

WGS84 是全球使用最多的 SRS,所以我倾向于说是的,但这完全取决于您的用例。如果您不确定要使用哪个 SRS,则可能表明您的用例没有对其施加任何约束。因此,请坚持使用 WGS84,但请记住不要在应用程序中混合使用不同的 SRS。顺便说一句:如果您尝试在同一张表中存储多个 SRS 中的几何图形,PostgreSQL 将引发异常 ;)

延伸阅读:ST_AsEWKTWGS84

【讨论】:

  • 非常感谢您的详细解释和努力。如前所述,我将坐标错误地写入了 POINT 的 DB。因此它正在正确地进行转换。查询回来我会用你提到的ST_Transform
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 2016-11-05
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多