postgis 如何处理使用不同 SRID 发送的坐标
How is postgis treating coordinates sent with different SRID
我是 运行 一个 Django 应用程序,我正在为我的数据库使用 PostGis 扩展。当我发送坐标时,我试图更好地理解引擎盖下发生的事情,特别是因为我正在使用转换为不同 SRID 的不同坐标系。我的问题有三个:
- 在数据库中创建点或多边形时是否django/postgis处理转换。
- 我可以使用不同的 SRID 查询回来吗
- 是否建议使用默认的 SRID=4326
假设我有一个这样的模型(注意我设置的是标准 SRID=4326):
class MyModel(models.Model):
name = models.CharField(
max_length=120,
)
point = models.PointField(
srid=4326,
)
polygon = models.PolygonField(
srid=4326,
)
- 现在我发送不同的坐标和具有不同 SRIDS 的多边形。
我在 django 文档中读到:
Moreover, if the GEOSGeometry is in a different coordinate system (has a different SRID value) than that of the field, then it will be implicitly transformed into the SRID of the model’s field, using the spatial database’s transform procedure
因此,如果我理解正确,这意味着当我发送这样的 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))'
发送一个多边形时,我从 DB
得到一个多边形 'SRID=4326;POLYGON ((4.512360573651161 0.002563158966576373, ' '4.512402191765552 0.002469312460126783, 4.512530396754145 ' '0.002528880231016955, 4.512488494972807 0.00261814442892858, ' '4.512360573651161 0.002563158966576373))'
- 我可以使用不同的 SRID 查询回来吗
不幸的是,我还没有找到一种方法来将相同的点查询回它们的原始 SRID。这可能吗?
- 最后,我主要处理欧洲的坐标,但我也可能不得不偶尔包含来自世界各地的坐标。
SRID=4326
是一个好的标准吗?
非常感谢您提前提供的所有帮助。真的很感激。
首先,我不是 GIS 专家(我只用 Django 和 GIS 创建了一些小东西),但是...
在这份关于 GeoDjango 的文档中:https://docs.djangoproject.com/en/3.1/ref/contrib/gis/tutorial/#automatic-spatial-transformations。根据它:
When doing spatial queries, GeoDjango automatically transforms geometries if they’re in a different coordinate system. ...
在控制台中尝试 (./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>)
转换几何体的 SRS 不仅仅是改变它们的 SRID。因此,如果由于某种原因在变换后坐标 return 具有完全相同的值,则很可能根本没有变换。
此示例使用 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
geometry,直接查看数据库中的SRS。如果您只是使用 Django 检查,可能是它在请求中再次转换坐标,这可能解释了您没有看到任何差异。
针对您的问题:
Is SRID=4326 a good standard to use?
WGS84 是全球最常用的 SRS,所以我倾向于说是,但这完全取决于您的用例。如果您不确定要使用哪个 SRS,这可能表明您的用例没有对其施加任何约束。因此,请坚持使用 WGS84,但请记住不要在您的应用程序中混合使用不同的 SRS。顺便说一句:如果您尝试在同一个 table 中的多个 SRS 中存储几何图形,PostgreSQL 将引发异常 ;)
我是 运行 一个 Django 应用程序,我正在为我的数据库使用 PostGis 扩展。当我发送坐标时,我试图更好地理解引擎盖下发生的事情,特别是因为我正在使用转换为不同 SRID 的不同坐标系。我的问题有三个:
- 在数据库中创建点或多边形时是否django/postgis处理转换。
- 我可以使用不同的 SRID 查询回来吗
- 是否建议使用默认的 SRID=4326
假设我有一个这样的模型(注意我设置的是标准 SRID=4326):
class MyModel(models.Model):
name = models.CharField(
max_length=120,
)
point = models.PointField(
srid=4326,
)
polygon = models.PolygonField(
srid=4326,
)
- 现在我发送不同的坐标和具有不同 SRIDS 的多边形。
我在 django 文档中读到:
Moreover, if the GEOSGeometry is in a different coordinate system (has a different SRID value) than that of the field, then it will be implicitly transformed into the SRID of the model’s field, using the spatial database’s transform procedure
因此,如果我理解正确,这意味着当我发送这样的 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))'
发送一个多边形时,我从 DB
'SRID=4326;POLYGON ((4.512360573651161 0.002563158966576373, ' '4.512402191765552 0.002469312460126783, 4.512530396754145 ' '0.002528880231016955, 4.512488494972807 0.00261814442892858, ' '4.512360573651161 0.002563158966576373))'
- 我可以使用不同的 SRID 查询回来吗
不幸的是,我还没有找到一种方法来将相同的点查询回它们的原始 SRID。这可能吗?
- 最后,我主要处理欧洲的坐标,但我也可能不得不偶尔包含来自世界各地的坐标。
SRID=4326
是一个好的标准吗?
非常感谢您提前提供的所有帮助。真的很感激。
首先,我不是 GIS 专家(我只用 Django 和 GIS 创建了一些小东西),但是... 在这份关于 GeoDjango 的文档中:https://docs.djangoproject.com/en/3.1/ref/contrib/gis/tutorial/#automatic-spatial-transformations。根据它:
When doing spatial queries, GeoDjango automatically transforms geometries if they’re in a different coordinate system. ...
在控制台中尝试 (./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>)
转换几何体的 SRS 不仅仅是改变它们的 SRID。因此,如果由于某种原因在变换后坐标 return 具有完全相同的值,则很可能根本没有变换。
此示例使用 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
geometry,直接查看数据库中的SRS。如果您只是使用 Django 检查,可能是它在请求中再次转换坐标,这可能解释了您没有看到任何差异。
针对您的问题:
Is SRID=4326 a good standard to use?
WGS84 是全球最常用的 SRS,所以我倾向于说是,但这完全取决于您的用例。如果您不确定要使用哪个 SRS,这可能表明您的用例没有对其施加任何约束。因此,请坚持使用 WGS84,但请记住不要在您的应用程序中混合使用不同的 SRS。顺便说一句:如果您尝试在同一个 table 中的多个 SRS 中存储几何图形,PostgreSQL 将引发异常 ;)