Ruby on Rails PostGIS - вставить запись полигона в БД

Я использую RoR с PostGIS для хранения данных о местоположении. Я пытаюсь сохранить предполагаемое местоположение, используя круг (например, центральную точку с радиусом).

Я пробовал что-то подобное, но это не работает:

@location = Location.new(:place_id => place.id,
                         :circle => %{ST_Buffer(ST_MakePoint(#{latitude}, #{longitude})::geography, #{accuracy})})

Я также пытался использовать RGeo и его фабрику, но не уверен, как именно его использовать.

Любая помощь будет оценена. Спасибо.

Редактировать 1: я добился некоторого прогресса.

factory = RGeo::Cartesian.factory
center_point = factory.point(latitude, longitude)
circle = center_point.buffer(accuracy)

@location = Location.new(:place_id => place.id,
                         :circle => circle)

НО - теперь выдает следующее исключение:

can't cast RGeo::Cartesian::Polygon Impl to string

Опять же, любая помощь будет оценена.


person Asaf    schedule 15.03.2014    source источник
comment
Имейте в виду, что PostGIS использует порядок осей (x y), который для WGS84 равен (долгота и широта).   -  person Mike T    schedule 17.03.2014
comment
@MikeT Спасибо. Я менял, но проблема была не в этом. Можете ли вы сказать, похоже ли это на проблему с кодом или на проблему с конфигурацией (возможно, что-то с адаптером)?   -  person Asaf    schedule 17.03.2014
comment
Мне это кажется скучным: %{ST_Buffer(ST_MakePoint(#{latitude}, #{longitude})::geography, #{accuracy})} -- ST_MakePoint предположительно пытается вернуть RGeo::Cartesian::Polygon и % {..} пытается преобразовать это в строку. Похоже, вам нужно это исправить.   -  person Steve Midgley    schedule 22.03.2014


Ответы (1)


Похоже, что столбец с именем circle в таблице locations является текстовым, а не столбцом геометрии. Как выглядит ваша схема?

Вероятно, вы также захотите установить свой SRID.

circle = RGeo::Cartesian.factory.point(0, 0).buffer(20)
@location = Location.new(:place_id => place.id, :circle => circle)
@locaiton.save

Другим и, вероятно, лучшим вариантом было бы просто сохранить точное местоположение и запросить местоположение с определенным расстоянием. Вы можете использовать либо оператор расстояния (http://postgis.net/docs/manual-2.1/geometry_distance_centroid.html) или оператор перекрытий (http://postgis.net/docs/manual-2.1/geometry_overlaps.html).

person waratuman    schedule 23.03.2014