如何在python中设置空间SQL查询的范围(geoalchemy)
自从我一直忙着试图弄清楚,如何使用geoalchemy2正确查询PostGIS数据库中的数据,geoalchemy2是
python的sqlalchemy支持空间数据库操作的扩展.
我正在使用来自Brandenburg(德国境内的管理区域)的python3.4和Openstreetmaps数据,我将这些数据输入到我当地的Postgres-DB中.数据为纬度/经度.我一直在关注如何使用geoalchemy包(https://geoalchemy-2.readthedocs.org/en/latest/orm_tutorial.html)的ORM部分进行设置的教程.一开始,一切都很顺利 >定义映射 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()需要某种bool输入,因此必须根据它来定义一个语句.那么这样的陈述有什么问题呢? session.query(QuerySchema).filter(func.ST_Contains(bbox,QuerySchema.way)) 检查func.ST_Contains(bbox,QuerySchema.way)的结果会将< geoalchemy2.functions.ST_Contains带到0x10a12a400; ST_Contains>所以很明显filter()将无法正常工作. 问题:如何执行操作才能正常工作,即只给出给定边界内的DB条目? 解决方法
试试这个查询:
session.query(QuerySchema).filter(QuerySchema.way.ST_Within(bbox)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |