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