2012-05-07 10 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" 

私はジャンゴを回避し、これを実行しようとすることで、直接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 = 4326; POINT(-0.094833 51.520667)"を持つWKTを拡張した場合、SRIDを入れることができます

+0

item = ArchivrItem(座標= GEOSGeometry( 'POINT(5 23)'、srid = 4326)) 'アイテム= ArchivrItem(座標= GEOSGeometry( 'SRID = 4326; POINT(5 23)'))' –

+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を使ってPostGISにインポートするためのSQLを構築するため、作成の構築に関係なく失敗します。

私の以前のコメントは、Debianの3.2.0を使用していましたが、この問題はまったく表示されませんでした。 3.2.3は、この問題をここで示しているバージョンです。 3.3.6へのアップグレードは問題を修正しました(3.3.3もテスト済みです)。私は今日、他のバージョンを試してみるつもりです。

あなたはとGEOSのバージョンを見ることができます: `項目は= ArchivrItem(=ポイント(5、23座標))`:うーん、私は今、同じエラーで、これらのすべてを試した

from django.contrib.gis.geos.libgeos import geos_version 
geos_version() 
関連する問題