从 ruby 中的 geojson 多边形中删除重复点的最佳方法是什么?

What is the best way to remove duplicate points from a geojson polygon in ruby?

我正在使用 rgeo ruby 库来解析 geojson 多边形。在具有重复点的多边形上调用解码时,行为为 return 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 功能,还是我应该自己推出?

明确地说,我只想删除连续的重复点,因为这是导致库对上述代码 return nil 的原因。我也不是在寻找诸如 postgis st_removerepeatedpoints 之类的数据库解决方案,而是在本质上寻找在 ruby.

中执行的这种行为

我不熟悉 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#merge, Object#tap, Enumerable#chunk_while, Enumerable#flat_map and Enumerable#uniq