如何在python(geoalchemy)中设置空间SQL查询的范围

And*_*ann 5 python sql postgis sqlalchemy geoalchemy

自从几天以来,我一直在忙于弄清楚如何使用 geoalchemy2 从 PostGIS 数据库正确查询数据,geoalchemy2 是支持空间数据库操作的 python sqlalchemy 的扩展。

我正在使用来自勃兰登堡(德国境内的管理区域)的 python3.4 和 Openstreetmaps 数据,我将这些数据输入到我的本地 Postgres-DB 中。数据以纬度/经度表示。我一直在关注有关如何使用 geoalchemy 包的 ORM 部分进行设置的教程 ( https://geoalchemy-2.readthedocs.org/en/latest/orm_tutorial.html )。一开始,一切都很顺利

  1. 定义映射

    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'))
    
    Run Code Online (Sandbox Code Playgroud)
  2. 定义数据库设置

    engine = create_engine(
    'postgresql+psycopg2://postgres_andi:{pwd}@localhost/osm'.format(
        pwd=keyring.get_password('osm', 'andi_postgres')))
    Session = sessionmaker(bind=engine)
    session = Session()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 做我的查询

    buildings = session.query(QuerySchema)
    
    Run Code Online (Sandbox Code Playgroud)

现在,一切正常,直到我尝试减少范围 - 因为我不想将所有建筑物都存储在我的数据库中,而可能只存储在给定边界或边界多边形内的建筑物。

  1. 通过定义边界框来缩小范围(WKT 格式)

    bbox = 'POLYGON ((13.01881424267171 52.50091209200498, 13.01881424267171 52.57800809377812, 12.87181701302189 52.57800809377812, 12.87181701302189 52.50091209200498, 13.01881424267171 52.50091209200498))'
    
    Run Code Online (Sandbox Code Playgroud)

我尝试使用 .filter() 和各种选项,但没有成功。到目前为止,我明白 filter() 需要某种 bool 输入,所以必须根据它定义一个语句。那么这样的声明有什么问题呢?

    session.query(QuerySchema).filter(func.ST_Contains(bbox, QuerySchema.way))
Run Code Online (Sandbox Code Playgroud)

检查func.ST_Contains(bbox, QuerySchema.way)带来的结果<geoalchemy2.functions.ST_Contains at 0x10a12a400; ST_Contains>显然filter()无法正常工作。

问题:我必须如何执行操作才能正常工作,即只给我指定边界内的那些数据库条目?

ban*_*ish 0

尝试这个查询:

session.query(QuerySchema).filter(QuerySchema.way.ST_Within(bbox))
Run Code Online (Sandbox Code Playgroud)