[英]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.