自从几天以来,我一直在忙于弄清楚如何使用 geoalchemy2 从 PostGIS 数据库中正确查询数据,geoalchemy2 是 python 支持空间数据库操作的 sqlalchemy 的扩展。
我正在使用来自勃兰登堡(德国行政区)的 python3.4 和 Openstreetmaps 数据,这些数据输入到我当地的 Postgres-DB 中。数据以纬度/经度为单位。我一直在关注如何使用 geoalchemy 包的 ORM 部分进行设置的教程(https://geoalchemy-2.readthedocs.org/en/latest/orm_tutorial.html)。一开始,一切都很顺利
定义映射
Base = declarative_base() class QuerySchema(Base): __tablename__ = "brandenburg_polygon" osm_id = Column(Integer, primary_key=True) name = Column(String) amenity = Column(String) way = Column(Geometry('POLYGON'))
定义数据库设置
engine = create_engine( 'postgresql+psycopg2://postgres_andi:{pwd}@localhost/osm'.format( pwd=keyring.get_password('osm', 'andi_postgres'))) Session = sessionmaker(bind=engine) session = Session()
做我的查询
buildings = session.query(QuerySchema)
现在,在我尝试减少范围之前,一切都运行良好——因为我不想将所有建筑物都存储在我的数据库中,但可能只存储在给定边界或边界多边形内的建筑物。
通过定义边界框缩小范围(WKT 格式)
bbox = 'POLYGON ((13.01881424267171 52.50091209200498, 13.01881424267171 52.57800809377812, 12.87181701302189 52.57800809377812, 12.87181701302189 52.50091209200498, 13.01881424267171 52.50091209200498))'
我尝试将 .filter() 与各种选项一起使用,但没有成功。到目前为止,我理解 filter() 需要某种布尔输入,因此必须根据它定义一个语句。那么这样的声明有什么问题呢?
session.query(QuerySchema).filter(func.ST_Contains(bbox, QuerySchema.way))
检查结果func.ST_Contains(bbox, QuerySchema.way)
带来的结果<geoalchemy2.functions.ST_Contains at 0x10a12a400; ST_Contains>
显然filter()
无法正常工作。
问题:我必须如何执行操作才能正常工作,即只给我给定边界内的那些数据库条目?