我使用的是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)发布于 2012-05-08 23:21:41
听起来你是想通过这样做来添加一个新的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,也就是说,后面是后面,而不是后面/后面。如果扩展WKT为"SRID=4326;POINT(-0.094833 51.520667)“,则可以添加一个SRID。
发布于 2013-02-16 01:57:23
在一位同事遇到同样的问题后,我们似乎已经追踪到了安装的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()https://stackoverflow.com/questions/10486149
复制相似问题