2

我有一个遗留区域数据,其中一些记录在其中Polygon,一些MultiPolygon以 JSON 格式存储在 noSQL DB 中。我需要将该数据迁移到area具有 ST_MultiPolygon 类型的列的 PostGIS 数据库。

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

现在,我正在像这样转换 MultiPolygons:

multipolygon = RGeo::GeoJSON.decode(location.area)
PostgisLocation.create(area: multipolygon)

但是当 area 不是多边形,而是多边形时,DB 会抛出异常:PG::InternalError: ERROR: parse error - invalid geometry

多边形的文本表示示例:

POLYGON ((-6.00606009808446 54.5901007810674, -6.01003269079491 54.5928954129105, -5.97732358111394 54.5870863982436, -6.00606009808446 54.5901007810674))

我想到的最愚蠢的事情是POLYGONMULTIPOLYGON单词替换,并添加额外的()括号。但是,我相信应该有更好的方法来使用 RGeo 库进行转换。我花了一些时间阅读 RGeo 的文档,但没有找到任何可以帮助我的东西。

4

2 回答 2

2

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

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)))
于 2018-02-21T17:22:50.627 回答
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 方法之前使用这种异常处理。

于 2018-05-15T23:05:59.577 回答