単純化すると、データの一部の次元が落ちる場合がある
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 だけをエレガントに消せるかもしれません。これらの方向での書き方が分かったら、あとで書くかもしれません。