Как установить экстент пространственного SQL-запроса в python (геоалхимия)

С тех пор я суетился, пытаясь выяснить, как правильно запрашивать данные из базы данных PostGIS, используя geoalchemy2, расширение sqlalchemy для python, поддерживающее пространственные операции с базами данных.

Я работаю с данными Python3.4 и Openstreetmaps из Бранденбурга (область администрирования в Германии), которые я подал в свою локальную базу данных Postgres-DB. Данные в лат / лонг. Я следовал инструкциям по настройке с использованием 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'))
    
  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()
    
  3. Сделать мой запрос

    buildings = session.query(QuerySchema)
    

Теперь все работает нормально, пока я не пытаюсь уменьшить экстент - потому что я не хочу, чтобы все здания хранились внутри моей БД, но, возможно, только те, которые находятся в пределах данной границы или граничного многоугольника.

  1. Уменьшите экстент, определив границу (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 at 0x10a12a400; ST_Contains>так очевидно filter() не будет работать должным образом.

Вопрос: Как мне выполнить операцию для правильной работы, т.е. дать мне только те записи БД в пределах заданной границы?

1 ответ

Попробуйте этот запрос:

session.query(QuerySchema).filter(QuerySchema.way.ST_Within(bbox))
Другие вопросы по тегам