簡體   English   中英

如何使用GeoDjango / PostGIS滿足“ enforce_srid_coordinate”約束?

[英]How do I satisfy “enforce_srid_coordinate” constraint with GeoDjango/PostGIS?

我正在使用GeoDjango,並具有一個帶有PointField的Django模型:

class ArchivrItem(models.Model):
    ...
    coordinate = models.PointField(srid=4326)

當我嘗試使用緯度和經度插入新的ArchivrItem時,出現以下錯誤:

ERROR:  new row for relation "archivr_archivritem" violates check constraint "enforce_srid_coordinate"

我可以避免Django,並通過嘗試這樣做直接在postgresql中得到相同的錯誤:

INSERT INTO archivr_archivritem (coordinate) VALUES ('POINT(51.520667 -0.094833)');

我可能對SRID和點系統過於幼稚和無知...我想念什么? 謝謝。

更新:我應該添加約束。 該表上的約束是:

"enforce_dims_coordinate" CHECK (st_ndims(coordinate) = 2)
"enforce_geotype_coordinate" CHECK (geometrytype(coordinate) = 'POINT'::text OR coordinate IS NULL)
"enforce_srid_coordinate" CHECK (st_srid(coordinate) = 4326)

聽起來您正在嘗試通過執行以下操作添加新的ArchivrItem:

item = ArchivrItem(coordinate='POINT(51.520667 -0.094833)')
item.save()

由於某些不確定的原因,這沒有獲得正確的默認SRID。 但是,明確指定它應該起作用,例如:

from django.contrib.gis.geos import Point
item = ArchivrItem(coordinate=Point(-0.094833, 51.520667, srid=4326))
item.save()

我想說srid如果要與模型定義匹配,則是可選的,但是在指定它時沒有害處,您可以看到是否僅使用對象方法即可對其進行修復。 https://docs.djangoproject.com/en/dev/ref/contrib/gis/db-api/#creating-and-saving-geographic-models包含更多示例。

[另外,請注意POINT()是X然后是Y,即lon然后是lat,不是lat / lon。 如果擴展了WKT,則可以將SRID放入“ SRID = 4326; POINT(-0.094833 51.520667)”]

一位同事遇到相同的問題后,我們似乎已將其歸結為安裝了GEOS版本的問題。 使用存在此問題的版本,如果p是django.contrib.gis.geos.Point,則p.wkb和p.ewkb返回相同的數據-EWKB缺少SRID信息。 由於Django使用EWKB構造要導入到PostGIS中的SQL,因此無論創建的構造如何,它都會失敗。

我以前的評論使用的是Debian 3.2.0,根本沒有顯示此問題。 3.2.3是在此處顯示此問題的版本。 升級到3.3.6可以解決此問題(並測試了3.3.3很好)。 今天晚些時候,我將有更多時間嘗試進一步跟蹤它時,我將嘗試其他版本。

您可以通過以下方式查看您的GEOS版本:

from django.contrib.gis.geos.libgeos import geos_version
geos_version()

暫無
暫無

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

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