Django postgis如何处理使用不同SRID发送的坐标

Django postgis如何处理使用不同SRID发送的坐标,django,postgresql,django-rest-framework,postgis,srid,Django,Postgresql,Django Rest Framework,Postgis,Srid,我正在运行一个django应用程序,我正在为我的数据库使用PostGis扩展。当我发送坐标时,我试图更好地理解引擎盖下发生了什么,特别是因为我使用的是不同的坐标系,这些坐标系转换为不同的SRID。我的问题有三个: django/postgis在数据库中创建点或多边形时是否处理转换 我可以使用不同的SRID查询它吗 建议使用默认SRID=4326吗 假设我有这样一个模型(注意,我正在设置标准SRID=4326): 现在我用不同的SRID发送不同的坐标和多边形 我在django文件中读到: 此外,如

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

  • django/postgis在数据库中创建点或多边形时是否处理转换
  • 我可以使用不同的SRID查询它吗
  • 建议使用默认SRID=4326吗
  • 假设我有这样一个模型(注意,我正在设置标准SRID=4326):

  • 现在我用不同的SRID发送不同的坐标和多边形
  • 我在django文件中读到:

    此外,如果GeoGeometry位于与字段不同的坐标系(具有不同的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的点时;点(11.061859 49.460983)
    我得到
    的SRID=4326;数据库中的点(11.061859 49.460983)
    。当我发送一个带有
    'SRID=25832的多边形时;多边形((123.279615732267284.1831980485285,'127.9249715130572 273.7782091450072,142.2351651215613''280.3825718937042,137.558146278483 290.279508688337,'123.27961573226284.1831980485285))
    我得到一个多边形
    'SRID=4326;多边形((4.512360573651161 0.002563158966576373,'4.512402191765552 0.002469312460126783,4.512530396754145''0.002528880231016955,4.512488494972807 0.00261814442892858,'4.512360573651161 0.002561589666576373))
    来自DB

  • 我可以使用不同的SRID查询它吗
  • 不幸的是,我还没有找到一种方法将相同的点查询回它们的原始SRID。这可能吗

  • 最后,我的工作主要是欧洲的坐标,但我也可能需要偶尔包括来自世界各地的坐标。
    SRID=4326
    是一个好的使用标准吗

  • 非常感谢您事先提供的帮助。非常感谢。

    首先,我不是地理信息系统的专家(我在Django和GIS中只创建了一些小东西),但是。。。 在本文档中,关于GeoDjango:。据它说:

    在进行空间查询时,GeoDjango会自动变换位于不同坐标系中的几何体

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

    from.models导入MyModel
    obj1=MyModel.objects.all().first()
    打印(obj1)
    打印(obj1.点)
    打印(方向(obj1.点))
    打印(obj1.point.srid)
    
    --编辑-- 您可以手动测试SRID之间的转换,类似于此页面:

    obj1.point.transform()
    
    变换几何体的SRS远不止是改变SRID。因此,如果由于某种原因,在转换后坐标返回的值完全相同,那么很可能根本没有转换

    此示例用于将几何体从
    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。顺便说一句:如果您试图在同一个表中的多个SR中存储几何体,PostgreSQL将引发异常;)


    进一步阅读:,

    你好!由于我对djang一无所知,我将从GIS的角度发表评论:对于您的问题:“多边形和点都将正确地转换为SRID=4326???”您是否尝试过该脚本并在存储坐标的PostgreSQL中进行了检查?尝试使用ST_AsEWKT。以及“我可以使用不同的SRID查询它吗”:是的,您可以使用ST_Transform。“是否建议使用默认SRID=4326”WGS84是使用最多的SRS,因此我倾向于说是,但这取决于您的用例。也许你正在报道的领域需要一个不同的SRSThanks@JimJones。是的,我已选中,并使用
    SRID4326
    保存。但我不知道它是否也能正确转换。例如,如果我发送一个point(11.061859 49.460983),我将从具有不同SRID的DB获得相同的值。当我发送一个多边形时,我得到了不同SRID的不同值(我编辑了我的问题),在转换后,两个参考系不太可能在同一个位置使用相同的坐标,因此我相信您的怀疑可能是有道理的:SRS只是被更改了,但没有执行任何转换。您是否尝试将它们打印到地图上,以查看它们是否仍然对应于同一位置,例如,使用pgAdmin IV的几何体查看器?啊啊啊,等等,对不起。。。该点未正确写入数据库。。。。现在它确实给了我一个不同的值。现在我非常确定它实际上是正确的转换(如果你想在你的答案中包括这一点),谢谢你的帮助。嗯,
    print(obj1.point.srid)
    给了我srid 4326。但我仍然不能100%确定这是否正确转换。不过我想是的。我
    from <yourapp>.models import MyModel
    obj1 = MyModel.objects.all().first()
    print(obj1)
    print(obj1.point)
    print(dir(obj1.point))
    print(obj1.point.srid)
    
    obj1.point.transform(<new-srid>)
    
    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)