単純化すると、データの一部の次元が落ちる場合がある

hfu2007-12-20

d:id:yellow_73:20071219#p2からトラックバックをいただきました。
元記事に、

DouglasPeuckerSimplifier においては com.vividsolutions.jts.geom.GeometryCollection になるものもあって、Polygon型ではないので、MultiPolygon型に変換するのはスルーしたため、例外が発生しました。

2007-12-19

とあります。

小さな島が線や点にまで単純化されているようです

私の手持ちの模擬データでは発生しなかったのですが、元データと単純化パラメータの具合で、小さな島のポリゴンの構成点数が 2 や 1 に単純化されてしまう場合があったのかもしれません。
構成点数が 2 になれば、その島は LineString になってしまいますし、構成点数が 1 になれば、その島は Point になってしまいます。

考えられる対策

このようなデータを Shapefile に格納するには、LineString や Point になってしまったデータはスキップするようにしなければならないかもしれません。具体的には、以下のような処理になるのではないかと思います。

# 擬コード! 実際に動くことは確認していません。
polygons = []
simplifled_geom.getNumGeometries.times do |i|
  part = simplified_geom.getGeometryN(i)
  polygons << part if part.getDimension == 2
end
# -> polygons から MultiPolygon を生成して Shapefile に書く

com.vividsolutions.jts.geom.Geometry#apply(GeometryComponentFilter filter) を使えばもっとエレガントに書けるかもしれません。あるいは、Geometry の set-theoretic methods をうまく使って LineString と Point だけをエレガントに消せるかもしれません。これらの方向での書き方が分かったら、あとで書くかもしれません。