gpt4 book ai didi

django - 如何使用 GeoDjango/PostGIS 满足 "enforce_srid_coordinate"约束?

转载 作者:行者123 更新时间:2023-11-29 13:36:15 24 4
gpt4 key购买 nike

我正在使用 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,即经度然后是纬度,而不是纬度/经度。如果使用“SRID=4326;POINT(-0.094833 51.520667)”扩展 WKT,则可以放入 SRID]

关于django - 如何使用 GeoDjango/PostGIS 满足 "enforce_srid_coordinate"约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10486149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com