Combine Geometry ---------------- Doing the union operation on two geometries is one of the most expensive operations you can possibly do; while it is reasonable for small numbers (say 5-10) when you start to get up to hundreds of geometries the cost can be measured in minutes. * Using GeometryCollection union() In JTS 1.9 there is a new union() method that will "do the right thing":: static Geometry combineIntoOneGeometry( Collection geometryCollection ){ GeometryFactory factory = FactoryFinder.getGeometryFactory( null ); // note the following geometry collection may be invalid (say with overlapping polygons) GeometryCollection geometryCollection = (GeometryCollection) factory.buildGeometry( geometryCollection ); return geometryCollection.union(); } * Using buffer( 0 ) You can get the same effect in JTS 1.8 using buffer(0):: GeometryFactory factory = FactoryFinder.getGeometryFactory( null ); // note the following geometry collection may be invalid (say with overlapping polygons) GeometryCollection geometryCollection = (GeometryCollection) factory.buildGeometry( geometryCollection ); Geometry union = geometryCollection.buffer(0); * Using union( geometry ) Using JTS versions prior to 1.9 you will need to combine the geometries one by one using geometry.union( geometry ):: static Geometry combineIntoOneGeometry( Collection geometryCollection ){ Geometry all = null; for( Iterator i = geometryCollection.iterator(); i.hasNext(); ){ Geometry geometry = i.next(); if( geometry == null ) continue; if( all == null ){ all = geometry; } else { all = all.union( geometry ); } } return all; } The above code is pretty much too simple to live; the correct way to do things is to break up your data into regions, union all the geometries in one region together; and then combine these at the end into one big geometry (this is the approach used above by the union() method).