1

ORMでは、これができると期待しています:

session.add(Lake("hello",Polygon([(0,0),(1,0),(1,1)])))
lake = session.get(Lake).first()
assert isinstance(lake.geometry, Polygon)
assert isinstance(lake.geometry.get_exterior_ring().get_points()[0], Point)
print(lake.geometry.get_exterior_ring().get_points()[0].x)

代わりに、私の湖のポイントにアクセスする唯一の方法は、かなり複雑なモンスターのコードを使用することです。

ring = func.ST_ExteriorRing(func.ST_GeomFromWKB(Lake.geometry))
node_count = func.ST_NPoints(ring)
node_series = func.generate_series(1, node_count)
node_n = func.ST_PointN(ring, node_series)
node_n_x = func.ST_X(node_n)
node_n_y = func.ST_Y(node_n)
rows = session.query(Lake, node_n_x, node_n_y).all()
lake_coasts = {}
for row in rows:
    lake = row[0]
    if not lake in lake_coasts:
        lake_coasts[lake] = []
    lake_coast = lake_coasts[lake]
    lake_coast.append((row[1], row[2]))
for lake in lake_coasts:
    lake_coast = lake_coasts[lake]
    print("Lake #{0}: \"{1}\" has its coasts at {2}"
          .format(lake.id, lake.name, lake_coast))

このループによって必要な座標が取得されますが、このインスタンスの海岸を返す Lake.get_coast() を実装する方法がわかりません。

また、ポイントに到達するためのネストがpostgisには多すぎるため、MULTIPOLYGONを使用した「Lake」にも同じ実装をあきらめました(少なくともそれがエラーメッセージの読み方です)

私はpostgis、gis、python、およびsqlaを初めて使用しますが、2日間のグーグル検索で、SQL-Alchemy 2内でORMのように見えるものを見つけることができませんでしたが、WKBを解析するためのSQLヘルパー関数(postgis)のみでした。データベース。追加のフレームワークが必要ですか? gdal、ogr、fiona を見ましたが、間違った方向を見ているような気がします。SQL-Alchemy2 を使用した、優れた構造のオープン ソース プロジェクトはありますか? エンティティ、DAO、何でも?このミニマリストの例を超えて、このモンスターを実際にどのように使用しますか?

4

1 に答える 1