GeoAlchemy2 хранит точку и результаты запроса
Документация по GeoAlchemy2 не выглядит полнофункциональной (по сравнению с предыдущей версией).
У меня есть модель:
class AddressCode(Base):
__tablename__ = 'address_codes'
id = Column(Integer, primary_key=True)
code = Column(Unicode(34))
geometry = Column(Geometry('POINT'))
И я хочу сохранить данные широты и долготы, которые я пытался сохранить в приведенной выше модели, например
"51.42553,-0.666085"
Что дает мне ошибку:
"Parse error at position 9 within Geometry (the "," char")
Кто-нибудь может пролить свет на то, что я здесь делаю неправильно?
Также по теме, как бы я выполнил запрос, чтобы сказать..
Показать ближайших 20 пользователей:
class AddressCode(Base):
__tablename__ = 'address_codes'
id = Column(Integer, primary_key=True)
name = Column(Unicode(34))
geometry = Column(Geometry('POINT'))
Что-то вроде?
geom_var = "51.42553,-0.666085"
Session.query(User).filter(func.ST_DWithin, 20, geom_var).all()
2 ответа
Как в GeoAlchemy, так и в GeoAlchemy2 вам необходимо указывать геометрию в хорошо известном текстовом формате, называемом WKT или общеизвестный текст, или общеизвестный двоичный формат. Для точки синтаксис 'POINT(X Y)'
таким образом 'POINT(-0.666085 51.42553)'
обратите внимание, что сначала идет долгота, затем широта.
Модуль shapely содержит полезные функции для обработки геометрии вне реляционных баз данных, а также простые преобразования между классами геометрии Python и форматами WKT, WKB.
Вот как вы это делаете:
эта таблица регионов определяется как:
regionTable = Table ('region', метаданные, Column('region_id', Integer, Sequence('region_region_id_seq'), primary_key=True), Column('type_cd', String(30)), Column('region_nm', String(255)), колонка ("geo_loc", география))
как запросить это:
(дайте мне все регионы в пределах 50 миль от моего текущего местоположения..)
sqlstring = select ([regionTable], func.ST_DWithin (regionTable.c.geo_loc, 'POINT (-74.78886216922375 40.32829276931833)', 1609 * 50))
результат = connection.execute(sqlstring)
for row in result:
print "region name:", row['region_nm']