package org.openjump.core.geomutils.algorithm; import java.util.ArrayList; import java.util.Iterator; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.MultiPolygon; import com.vividsolutions.jts.geom.Polygon; public class GeometryConverter { /** * * @param polygon a Polygon or MultiPolygon * @return if the input Geometry is neither a Polygon nor a MultiPolygon it is returned */ public static ArrayList transformPolygonToLineStrings(Geometry polygon){ ArrayList<Geometry> inGeoms = new ArrayList(); ArrayList<Geometry> lines = new ArrayList(); GeometryFactory gf = new GeometryFactory(); if (polygon instanceof MultiPolygon){ inGeoms.addAll(explodeGeomsIfMultiG(polygon)); } else if(polygon instanceof Polygon) { inGeoms.add(polygon); } else{ //-- all other geometry types are ignored and returned as is inGeoms.add(polygon); return inGeoms; } for (Iterator iterator = inGeoms.iterator(); iterator.hasNext();) { Polygon poly = (Polygon) iterator.next(); lines.add(gf.createLineString(poly.getExteriorRing().getCoordinates())); if (poly.getNumInteriorRing() > 0){ for (int i = 0; i < poly.getNumInteriorRing(); i++) { lines.add(gf.createLinearRing(poly.getInteriorRingN(i).getCoordinates())); } } } return lines; } /** * The method explodes a geometry, if it is a multi-geometry (Geometry Collection), into their parts. * @param geom * @return a list of geometries */ public static ArrayList<Geometry> explodeGeomsIfMultiG(Geometry geom){ ArrayList<Geometry> geoms = new ArrayList<Geometry>(); if (geom instanceof GeometryCollection){ //System.out.println("explode multigeoms"); GeometryCollection multig = (GeometryCollection)geom; for (int i = 0; i < multig.getNumGeometries(); i++) { Geometry g = (Geometry) multig.getGeometryN(i); geoms.add(g); } } else{ geoms.add(geom); } return geoms; } }