2012-05-07 62 views
1

我使用GeoDjango內置,並有一個PointField一個Django模型:如何使用GeoDjango/PostGIS滿足「enforce_srid_coordinate」約束條件?

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和點SYSTE幼稚和無知ms ...我錯過了什麼?謝謝。

更新:我應該添加約束是什麼。桌子上的約束條件是:

"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) 

回答

1

這聽起來像你試圖通過這樣做是爲了添加新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。如果將SRID擴展爲「SRID = 4326; POINT(-0.094833 51.520667)」],則可以將SRID放入;

+0

嗯,現在我已經嘗試了所有的這些,用了同樣的錯誤:'項目= ArchivrItem(座標=點(5,23))' ,'item = ArchivrItem(coordinate = GEOSGeometry('SRID = 4326; POINT(5 23)'))'和'item = ArchivrItem(coordinate = GEOSGeometry('POINT(5 23)',srid = 4326))''。 –

+0

我已經成功地在SQL中直接管理它,通過插入這個值作爲一個值:'ST_SetSrid(ST_PointFromText('POINT(5 23)'),4326)'。 –

+0

PointFromText有一個SRID參數,不需要SetSrid:http://www.postgis.org/docs/ST_PointFromText.html。你能得到它輸出它試圖運行的SQL(該頁面有一個例子),看看它試圖從Django做什麼? –

0

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

我以前的評論是使用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() 
相關問題