簡體   English   中英

postgis 如何處理使用不同 SRID 發送的坐標

[英]How is postgis treating coordinates sent with different SRID

我正在運行 django 應用程序,並且我正在為我的數據庫使用 PostGis 擴展。 我試圖更好地理解當我發送坐標時會發生什么,特別是因為我正在使用不同的坐標系,這些坐標系轉換為不同的 SRID。 我的問題有三個:

  1. 在數據庫中創建點或多邊形時,django/postgis 是否處理轉換。
  2. 我可以使用不同的 SRID 查詢它嗎
  3. 是否建議使用默認的 SRID=4326

假設我有一個像這樣的 model(注意我正在設置標准 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)' When I send a polygon with 'SRID=25832;POLYGON ((123.2796155732267 284.1831980485285, ' '127.9249715130572 273.7782091450072, 142.2351651215613 ' '280.3825718937042, 137.558146278483 290.279508688337, ' '123.2796155732267 284.1831980485285))' I get a polygon 'SRID=4326;POLYGON ((4.512360573651161 0.002563158966576373, ' '4.512402191765552 0.002469312460126783, 4.512530396754145 ' '0.002528880231016955, 4.512488494972807 0.00261814442892858, ' '4.512360573651161 0.002563158966576373))' from the DB

  1. 我可以使用不同的 SRID 查詢它嗎

不幸的是,我還沒有找到將相同點查詢回其原始 SRID 的方法。 這甚至可能嗎?

  1. 最后,我主要使用歐洲的坐標,但我也可能不得不偶爾包含來自世界各地的坐標。 SRID=4326是一個很好的標准嗎?

非常感謝您提前提供的所有幫助。 非常感謝。

轉換幾何的 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

首先,我不是 GIS 方面的專家(我在Django和 GIS 中只創建了一些小東西),但是... /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)

--edit-- 您可以手動測試與此頁面類似的 SRID 之間的轉換: https://gis.stackexchange.com/questions/94640/geodjango-transform-not-working

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM