我正在使用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中执行的这种行为。
答案 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#merge,Object#tap,Enumerable#chunk_while,Enumerable#flat_map和Enumerable#uniq。