使用RGeo gem将Polygon转换为MultiPolygon

时间:2018-02-09 10:09:22

标签: ruby-on-rails ruby postgis rgeo

我有遗留区域数据,其中一些记录位于Iterated over Z Iterated over Y Iterated over X ,一些记录以Polygon格式存储在noSQL DB中,采用JSON格式。我需要将该数据迁移到具有MultiPolygon列的PostGIS数据库,该列的类型为ST_MultiPolygon。

所以,我的问题是:如何使用RGeo gem或类似的东西将area区域转换为Polygon

现在,我正在转换MultiPolygons:

MultiPolygon

但是当区域不是多边形,而是多边形时,DB抛出异常:multipolygon = RGeo::GeoJSON.decode(location.area) PostgisLocation.create(area: multipolygon)

多边形文本表示的示例:

PG::InternalError: ERROR:  parse error - invalid geometry

我想到的最愚蠢的事情是用POLYGON ((-6.00606009808446 54.5901007810674, -6.01003269079491 54.5928954129105, -5.97732358111394 54.5870863982436, -6.00606009808446 54.5901007810674)) 字替换POLYGON,并添加额外的MULTIPOLYGON个括号。但是,我相信应该有一种更好的方法来转换它使用RGeo库。我花了一些时间阅读RGeo的文档,但没有找到任何可以帮助我的东西。

2 个答案:

答案 0 :(得分:1)

您可以使用多边形数组构建多边形。如果你只传入一个项目,你应该得到你想要的结果。

poly_text = 'POLYGON((0 0, 0 10, 10 0, 10 10, 0 0))'
factory = RGeo::Geos.factory(:srid => 4326)
polygon = factory.parse_wkt(poly_text)
puts factory.multi_polygon([polygon]).to_s
# MULTIPOLYGON (((0.0 0.0, 0.0 10.0, 10.0 0.0, 10.0 10.0, 0.0 0.0)))

答案 1 :(得分:0)

有很多不同的方法可以解决这个问题我确定,但也许您可以使用ActiveRecord回调来处理异常?

#used $factory as placeholder for whatever it is you're using
class ModelName << ActiveRecord::Base
  before_create do |r|
    if area.count > 1
      polygons = []
      area.each do |shp|
        polygons << shp
      end
      r.area = $factory.multi_polygon(polygons)
      r.save
    end
  end
  #....
end

我的代码不是很紧,我甚至不能完全确定回调本身是否能正常工作,但我想你得到的是要点。当然,在使用#save或#create方法之前,您可以使用这种异常处理。