1

私は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)
4

2 に答える 2

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=4326;POINT(-0.094833 51.520667)" で拡張された WKT の場合、SRID を入れることができます]

于 2012-05-08T15:21:41.183 に答える
0

同僚が同じ問題に遭遇した後、インストールされている 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()
于 2013-02-15T17:57:22.520 に答える