All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.vividsolutions.jtstest.testbuilder.geom.GeometryCombiner Maven / Gradle / Ivy

The newest version!
package com.vividsolutions.jtstest.testbuilder.geom;

import java.util.*;
import com.vividsolutions.jts.algorithm.*;
import com.vividsolutions.jts.geom.*;

public class GeometryCombiner 
{
  private GeometryFactory geomFactory;
  
  public GeometryCombiner(GeometryFactory geomFactory) {
    this.geomFactory = geomFactory;
  }

  public Geometry addPolygonRing(Geometry orig, Coordinate[] pts)
  {
    LinearRing ring = geomFactory.createLinearRing(pts);
    
    if (orig == null) {
      return geomFactory.createPolygon(ring, null);
    }
    if (! (orig instanceof Polygonal)) {
      return combine(orig, 
          geomFactory.createPolygon(ring, null));
    }
    // add the ring as either a hole or a shell
    Polygon polyContaining = findPolygonContaining(orig, pts[0]);
    if (polyContaining == null) {
      return combine(orig, geomFactory.createPolygon(ring, null));
    }
    
    // add ring as hole
    Polygon polyWithHole = addHole(polyContaining, ring);
    return replace(orig, polyContaining, polyWithHole);
  }
  
  public Geometry addLineString(Geometry orig, Coordinate[] pts)
  {
    LineString line = geomFactory.createLineString(pts);
    return combine(orig, line);
  }
  
  public Geometry addPoint(Geometry orig, Coordinate pt)
  {
    Point point = geomFactory.createPoint(pt);
    return combine(orig, point);
  }
  
  private static Polygon findPolygonContaining(Geometry geom, Coordinate pt)
  {
    PointLocator locator = new PointLocator();
    for (int i = 0; i < geom.getNumGeometries(); i++) {
      Polygon poly = (Polygon) geom.getGeometryN(i);
      int loc = locator.locate(pt, poly);
      if (loc == Location.INTERIOR)
        return poly;
    }
    return null;
  }
  
  public Polygon addHole(Polygon poly, LinearRing hole)
  {
    int nOrigHoles = poly.getNumInteriorRing();
    LinearRing[] newHoles = new LinearRing[nOrigHoles + 1];
    for (int i = 0; i < nOrigHoles; i++) {
      newHoles[i] = (LinearRing) poly.getInteriorRingN(i);
    }
    newHoles[nOrigHoles] = hole;
    return geomFactory.createPolygon((LinearRing) poly.getExteriorRing(), newHoles);
  }
  
  public Geometry combine(Geometry orig, Geometry geom)
  {
    List origList = extractElements(orig, true);
    List geomList = extractElements(geom, true);
    origList.addAll(geomList);
    
    if (origList.size() == 0) {
      // return a clone of the orig geometry
      return (Geometry) orig.clone();
    }
    // return the "simplest possible" geometry
    return geomFactory.buildGeometry(origList);
  }
  
  public static List extractElements(Geometry geom, boolean skipEmpty)
  {
    List elem = new ArrayList();
    if (geom == null)
      return elem;
    
    for (int i = 0; i < geom.getNumGeometries(); i++) {
      Geometry elemGeom = geom.getGeometryN(i);
      if (skipEmpty && elemGeom.isEmpty())
        continue;
      elem.add(elemGeom);
    }
    return elem;
  }
  
  public static Geometry replace(Geometry parent, Geometry original, Geometry replacement)
  {
    List elem = extractElements(parent, false);
    Collections.replaceAll(elem, original, replacement);
    return parent.getFactory().buildGeometry(elem);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy