2012-05-07 89 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() 
相关问题