【问题标题】:Rails - PostGIS + postgis_adapter Geometry ProblemRails - PostGIS + postgis_adapter 几何问题
【发布时间】:2011-08-22 19:33:34
【问题描述】:

我在 Ruby 1.9.2 上将 postgis_adapter 与 PostgreSQL 9.0.4、PostGIS 1.5.2 和 Rails 3.1.0 一起使用。 如 postgis_adapter README 中所述,我尝试执行

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>

希望有人有想法。

【问题讨论】:

    标签: ruby-on-rails ruby postgresql postgis


    【解决方案1】:

    我对 Rails 和 Ruby 的了解非常有限,但请尝试一下:

    class Model < ActiveRecord::Base
    end
    
    pt = Model.new(:geom => Point.from_x_y(10,20))
    
    pt.save
    

    【讨论】:

    • m = Model.new :attrs + m.save 实际上和Model.create :attrs是一样的
    • 根据我对 PostGIS 的了解,该错误意味着到达数据库的不是有效的几何图形。您是否使用具有几何列的 PostgreSQL 进行接口?
    • @pex 所以,发生的事情(发生在我身上,有那个错误)是到达 PostGIS 的不是有效的几何图形。我不知道 Ruby 是如何插入几何图形的。
    【解决方案2】:

    执行摘要:如果您将其更改为:它可能会起作用:

    Model.create(:the_name_of_your_geo_column =&gt; Point.from_x_y(10,20))

    较长的版本,很可能是 Ruby 咆哮:我几乎没有写过 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,我不愿将其作为答案发布,但上述工作(对我来说令人费解),您也许可以根据您的情况进行调整。

    【讨论】:

      【解决方案3】:

      添加空间参考系统标识符 (SRID) 为我解决了这个问题:

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

      如果您使用的是 Google 地图,则 4326 是正确的 SRID。其他地图和供应商可能会使用其他东西。

      【讨论】:

        【解决方案4】:

        在将工作应用程序从 Rails-3.0 升级到 3.1 时,我在使用 spatial_adapter 时遇到了类似的问题。似乎较新版本的 ActiveRecord 类型在插入期间将您的记录转换为 GeoRuby 对象。 activerecord-postgis-adapter 正确处理几何列的类型转换(大概是 EWKT)。我今天花了很多时间追这个,Aaron Patterson's response in this post 很有帮助。

        要解决您的问题,请升级您的 Gemfile 和 database.yml 以使用 activerecord-postgis-adapter

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多