SQL-Alchemy的python-native对象在哪里?

时间:2013-05-23 01:06:56

标签: python sqlalchemy postgis geoalchemy

在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()来返回这个实例的海岸。

此外,我放弃了使用MULTIPOLYGON实现相同的“Lake”,因为嵌套到了postgis的点数太多了(至少这是我读错误信息的方式)

我是postgis,gis,python和sqla的新手但是在两天的谷歌搜索中我找不到任何看起来像SQL-Alchemy 2中的ORM但只有一些SQL辅助函数(postgis)来解析WKB但数据库中。我需要一些额外的框架吗?我看到gdal,ogr,fiona,但我觉得我看错了方向。是否有一些使用SQL-Alchemy2的开源项目具有良好的结构?实体,DAO,什么?除了这个极简主义的例子,你如何实际使用这个怪物?

0 个答案:

没有答案