Django postgis如何处理使用不同SRID发送的坐标
我正在运行一个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文件中读到: 此外,如
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=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)
- 顺便说一句,你问题中的多边形变换是正确的
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)