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']
Другие вопросы по тегам