从 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。
我正在使用 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。