Rails - PostGIS + postgis_adapter Проблема геометрии - PullRequest
4 голосов
/ 11 мая 2011

Я использую postgis_adapter вместе с PostgreSQL 9.0.4, PostGIS 1.5.2 и Rails 3.1.0 на Ruby 1.9.2.Как описано в README postgis_adapter, я пытался выполнить

Model.create(:geom => Point.from_x_y(10,20))

Postgres отвечает

ERROR: parse error - invalid geometry
HINT: You must specify a valid OGC WKT geometry type such as POINT, LINESTRING or POLYGON

Созданный объект GeoRuby выглядит следующим образом:

#<GeoRuby::SimpleFeatures::Point:0x0000010420a620 @srid=4326, @with_z=false, @with_m=false, @y=20, @x=10, @z=0.0, @m=0.0>

Надеюсь, у кого-то появилась идея.

Ответы [ 4 ]

1 голос
/ 13 мая 2011

Резюме: это может сработать, если вы измените его на:

Model.create(:the_name_of_your_geo_column => Point.from_x_y(10,20))

Более длинная версия, с высокой вероятностью ревущих Руби: я едва написал слово rb, но видел на этой неделе слишком много великих проектов, чтобы продолжать пребывать в состоянии невежества. Работа с сообщениями об ошибках в irb (начиная с 0 на языке, но очень хорошо знакомы с PostGIS):

ActiveRecord::Base.establish_connection(:adapter=>'postgresql',:database=>'moveable')

pt = TablePoint.new(:data => "Hello!",:geom => Point.from_x_y(1,2))
NameError: uninitialized constant Point

Итак, require 'postgis_adapter', но потом:

PGError: ERROR:  relation "table_points" does not exist

Это должно быть то удивительное соглашение об именах в ActiveRecord, о котором я слышал. Поэтому создайте таблицу с именем table_points, потому что я не знаю, каковы методы модели / синхронизации базы данных.

moveable=> create table table_points(data text, geo_something geometry);

Обратите внимание, здесь я использовал geometry, а не geography, потому что мой первый инстинкт вашей проблемы заключался в том, что методы моделирования на уровне адаптера базы данных создавали точечные типы. Вовсе нет, на самом деле. Затем снова в irb,

pt = TablePoint.new(:geom => Point.from_x_y(1,2))
ActiveRecord::UnknownAttributeError: unknown attribute: geom    

Нет атрибута с именем geom? Просто чтобы посмотреть, что произойдет, снова в psql:

moveable=> alter table table_points add column geom geometry;
ALTER TABLE

Тогда:

irb(main):014:0> pt = TablePoint.new(:geom => Point.from_x_y(10,20))
=> #<TablePoint data: nil, geo_something: nil, geom: #<GeoRuby::SimpleFeatures::Point:0x1022555f0 @y=20, @with_m=false, @x=10, @m=0.0, @with_z=false, @z=0.0, @srid=-1>>
irb(main):015:0> pt.save
=> true

Невероятно! Что если бы я сделал:

pt = TablePoint.new(:data => 'is this even possible?', :geom => Point.from_x_y(38,121), :geo_something => Point.from_x_y(37,120))
=> #<TablePoint data: "is this even possible?", geo_something: #<GeoRuby::SimpleFeatures::Point:0x102041098 @y=120, @with_m=false, @x=37, @m=0.0, @with_z=false, @z=0.0, @srid=-1>, geom: #<GeoRuby::SimpleFeatures::Point:0x1020410c0 @y=121, @with_m=false, @x=38, @m=0.0, @with_z=false, @z=0.0, @srid=-1>>
irb(main):023:0> pt.save
=> true

Еще более невероятно!

moveable=> select * from table_points;
  data  |  geo_something  |  geom  
--------+-----------------+--------
        |                 | 0101000000000
        | 010100000000000 | 
        | 010100000000000 | 
...ble? | 00005E400000000 | 010000405E40
(4 rows)

Я не решаюсь опубликовать это как ответ из-за фундаментального недостатка знакомства с Ruby, но все вышеперечисленное работает (для меня), и вы, возможно, сможете адаптировать его к вашему делу.

0 голосов
/ 13 ноября 2014

Я столкнулся с подобной проблемой, используя atial_adapter при обновлении рабочего приложения с Rails-3.0 до 3.1. Кажется, более новые версии типа ActiveRecord приводят вашу запись к объекту GeoRuby во время вставки. activerecord-postgis-adapter правильно обрабатывает приведение типов вашего столбца геометрии (предположительно в EWKT). Я потратил много времени, гоняясь за этим сегодня, и ответ Аарона Паттерсона в этом посте был очень полезным.

Чтобы исправить вашу проблему, обновите ваш Gemfile и database.yml, чтобы использовать activerecord-postgis-adapter.

0 голосов
/ 18 марта 2012

Добавление идентификатора пространственной привязки системы (SRID) устранило эту проблему для меня:

Model.create(:geom => Point.from_x_y(10,20, 4326))

Если вы используете Google Maps, 4326 является правильным SRID.Другие карты и поставщики могут использовать что-то еще.

0 голосов
/ 11 мая 2011

Мои знания Rails и Ruby очень ограничены, но попробуйте вместо этого:

class Model < ActiveRecord::Base
end

pt = Model.new(:geom => Point.from_x_y(10,20))

pt.save
...