繁体   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