2017-06-27 4 views
5

sqlalchemygeoalchemy2をPython 3.5で使用して空間操作をしようとしています。私はgeom属性としてポイントを持つテーブルを持っています。私はすでにテーブルを読んだ後、ドキュメントの指示に従っています:空間的サブセット化とPostGISデータベースのエラー

これは私のテーブルの列の名前を正しく返します。ここでは、POLYGONオブジェクトの内部にある点だけを選択して、データの空間サブセットを作成します。私はST_ContainsST_Intersectionで試してみました:

# Create session for queries 
Session = sessionmaker(bind=engine) 
session = Session() 

#SELECT * FROM table: 
q = session.query(table).filter(table.c.geom.ST_Intersects(func.GeomFromEWKT(<POLYGON>))) 

POLYGONが定義されSRID=4326とWKTジオメトリです。私はすでに同じポリゴンの異なる形で試してみましたが、うまくいきませんでした。クエリを実行すると、次のエラーが返されます。

(psycopg2.InternalError) geometry contains non-closed rings 
HINT: "...140.965576171875 -11.11288507032144))" <-- parse error at position 166 within geometry 

どこが失敗していますか?

+0

不足しているポイントを追加するには、ポリゴンのWKTを置きます。エラーが示すように、リングはおそらく閉じていません(例えば、各リングの最初と最後のポイントは同じでなければなりません) – JGH

+0

'wkt_string =" POLYGON((141.0205078125 -9.166331387642987、143.602294921875 -9.155485188844034、143.67919921875 -11.112885070321443、140.965576171875 -11.11288507032144 )) "' POLYGONオブジェクトです。あなたが言ったように、ポリゴンは実際には有効ではありません。それにもかかわらず、私は 'sqlalchemy.sql.func.ST_MakeValid'を使用しようとしましたが、問題は持続します。何か案は? –

答えて

2

使用しているポリゴンが閉じていません。最初と最後の座標は同じでなければなりません。それを変更します。あなたがラインからconstruct the polygon

また
wkt_string = "POLYGON((141.0205078125 -9.166331387642987, 
         143.602294921875 -9.155485188844034, 
         143.67919921875 -11.112885070321443, 
         140.965576171875 -11.11288507032144, 
         141.0205078125 -9.166331387642987))" 

ができ、自動的に

SELECT ST_MakePolygon(
     ST_AddPoint(foo.open_line, ST_StartPoint(foo.open_line))) 
FROM (
    SELECT ST_GeomFromText(
      'LINESTRING(141.0205078125 -9.166331387642987, 
         143.602294921875 -9.155485188844034, 
         143.67919921875 -11.112885070321443, 
         140.965576171875 -11.11288507032144)') 
       As open_line) 
    As foo; 
関連する問題