0

我正在使用 rgeo ruby​​ 库来解析 geojson 多边形。行为是在对具有重复点的多边形调用 decode 时返回 nil,如下例所示:

geom = {:geom=>{"type"=>"Polygon", "coordinates"=>[[[-82.5721, 28.0245], [-82.5721, 28.0245] ... }
geo_factory = RGeo::Cartesian.factory(:srid => 4326)
rgeo_geom = RGeo::GeoJSON.decode(geom, json_parser: :json, geo_factory: geo_factory)

由于开头重复的点,执行此代码后 rgeo_geom 将为 nil。

清理这个多边形的最有效方法是什么?是否有内置的 rgeo 功能或者我应该自己推出?

需要明确的是,我只想删除连续的重复点,因为这是导致库为上述代码返回 nil 的原因。我也不是在寻找诸如 postgis st_removerepeatedpoints 之类的数据库解决方案,而是在寻找在 ruby​​ 中执行的这种行为。

4

1 回答 1

1

我不熟悉rgeo,但从纯 Ruby 的角度来看,我认为您可以执行以下操作。

h = { :geom=>{
        "type"=>"Polygon",
        "coordinates"=>[
          [-80.1234, 28.1234], [-82.5721, 28.0245], [-82.5721, 28.0245],
          [-83.1234, 29.1234], [-82.5721, 28.0245], [-83.1234, 29.1234],
          [-83.1234, 29.1234], [-83.1234, 29.1234]
        ]
      } 
    }

该问题显示"coordinates"=>[[[-82.5721, 28.0245],...没有与中间左括号匹配的右括号。我假设应该只有两个左括号。如果不是这种情况,我的答案将不得不修改。

以下不变异h。为了证明这是真的,首先计算h.

hhash = h.hash
  #=> -4413716877847662410

h.merge({ :geom=>(h[:geom].merge("coordinates"=>
  h[:geom]["coordinates"].chunk_while(&:==).map(&:first))) })
  #=> { :geom=>{
  #       "type"=>"Polygon",
  #       "coordinates"=>[
  #         [-80.1234, 28.1234], [-82.5721, 28.0245], [-83.1234, 29.1234], 
  #         [-82.5721, 28.0245], [-83.1234, 29.1234]
  #       ]
  #     }
  #   }

h.hash == hhash
  #=> true

请参阅Hash#mergeObject#tapEnumerable#chunk_whileEnumerable#flat_mapEnumerable#uniq

于 2018-01-12T05:59:19.213 回答