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

时间:2018-01-11 20:19:30

标签: ruby rgeo

我正在使用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中执行的这种行为。

1 个答案:

答案 0 :(得分: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