为Ruby 1.9和Rails 3.2.5编写GeoRuby Oracle Adapter

时间:2012-07-01 04:37:39

标签: ruby-on-rails ruby oracle activerecord georuby

我们是一家基于GIS RoR的软件公司,负责处理空间数据。 目前,我们直接在Oracle中执行纯SQL,但这是一个具有挑战性的过程,现在我们考虑切换到GeoRuby的想法。
我们希望将GeoRuby与我们公司的Oracle数据库和Rails环境一起使用。
据您所知,没有结构良好的适配器用于此目的。
目前,我正在开发自己的空间oracle适配器。 现在,我可以使用迁移创建表格和几何列。此外,我可以设法为表创建模型。
例如,假设GeoShape模型具有两个属性(名称:string和geom:geometry),我可以这样做:

g = GeoShape.new(:name => "Point1", geom: Point.from_x_y(-1.6, 2.8, 123))

执行上述声明后,我有:

=> #<GeoShape id: nil, name: "Point1", geom: <GeoRuby::SimpleFeatures::Point:0x6a3cb030 @srid=123, @with_z=false, @with_m=false, @y=2.8, @x=-1.6, @z=0.0, @m=0.0>, created_at: nil, updated_at: nil>

现在我想用g.save将我的模型保存到DB。

我收到以下错误,这是完全合乎逻辑的,因为GeoRuby和Oracle类型之间的类型不匹配。

INSERT INTO "GEO_SHAPES" ("CREATED_AT", "GEOM", "ID", "NAME", "UPDATED_AT") VALUES (:a1, :a2, :a3, :a4, :a5)  [["created_at", Sun, 01 Jul 2012 04:34:34 UTC +00:00], ["geom", #<GeoRuby::SimpleFeatures::Point:0x6a3d3410 @srid=123, @with_z=false, @with_m=false, @y=2.8, @x=-1.6, @z=0.0, @m=0.0>], ["id", 10053], ["name", "Point1"], ["updated_at", Sun, 01 Jul 2012 04:34:34 UTC +00:00]]
ActiveRecord::StatementInvalid: OCIError: ORA-00932: inconsistent datatypes: expected MDSYS.SDO_GEOMETRY got CHAR: INSERT INTO "GEO_SHAPES" ("CREATED_AT", "GEOM", "ID", "NAME", "UPDATED_AT") VALUES (:a1, :a2, :a3, :a4, :a5)   

<小时/> 有人知道这样做的过程吗?
我想,我必须将我的GeoRuby结构映射到相应的Oracle SDO_Geometry,但我对这个过程一无所知。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

有一个很棒的宝石rgeo

  

其核心是行业标准OGC Simple的实施   功能规范,提供数据表示   几何对象,如点,线和多边形,以及a   几何分析操作集。这使其成为建模的理想选择   地理定位数据。它还支持一套可选的附加模块   提供各种与地理位置相关的服务。

答案 1 :(得分:0)

我可以设法做到这一点。现在我可以直接从GeoRuby模型保存到Oracle DB。 该过程在this主题中进行了说明。