private void addLine(Coordinate[] pts) {
   SegmentString segStr = new BasicSegmentString(pts, null);
   List segChains = MonotoneChainBuilder.getChains(segStr.getCoordinates(), segStr);
   for (Iterator i = segChains.iterator(); i.hasNext(); ) {
     MonotoneChain mc = (MonotoneChain) i.next();
     index.insert(mc.getEnvelope(), mc);
   }
 }
 private void init(Geometry geom) {
   List lines = LinearComponentExtracter.getLines(geom);
   for (Iterator i = lines.iterator(); i.hasNext(); ) {
     LineString line = (LineString) i.next();
     Coordinate[] pts = line.getCoordinates();
     addLine(pts);
   }
 }
 /**
  * Tests whether any component of the test Geometry intersects the interior of the target
  * geometry. Handles test geometries with both linear and point components.
  *
  * @param geom a geometry to test
  * @return true if any component of the argument intersects the prepared area geometry interior
  */
 protected boolean isAnyTestComponentInTargetInterior(Geometry testGeom) {
   List coords = ComponentCoordinateExtracter.getCoordinates(testGeom);
   for (Iterator i = coords.iterator(); i.hasNext(); ) {
     Coordinate p = (Coordinate) i.next();
     int loc = targetPointLocator.locate(p);
     if (loc == Location.INTERIOR) return true;
   }
   return false;
 }
 /**
  * Tests whether any component of the target geometry intersects the test geometry (which must be
  * an areal geometry)
  *
  * @param geom the test geometry
  * @param repPts the representative points of the target geometry
  * @return true if any component intersects the areal test geometry
  */
 protected boolean isAnyTargetComponentInAreaTest(Geometry testGeom, List targetRepPts) {
   PointOnGeometryLocator piaLoc = new SimplePointInAreaLocator(testGeom);
   for (Iterator i = targetRepPts.iterator(); i.hasNext(); ) {
     Coordinate p = (Coordinate) i.next();
     int loc = piaLoc.locate(p);
     if (loc != Location.EXTERIOR) return true;
   }
   return false;
 }
 private void countSegs(
     RayCrossingCounter rcc, Envelope rayEnv, List monoChains, MCSegmentCounter mcSegCounter) {
   for (Iterator i = monoChains.iterator(); i.hasNext(); ) {
     MonotoneChain mc = (MonotoneChain) i.next();
     mc.select(rayEnv, mcSegCounter);
     // short-circuit if possible
     if (rcc.isOnSegment()) return;
   }
 }
 /**
  * Tests whether any representative point of the test Geometry intersects the target geometry.
  * Only handles test geometries which are Puntal (dimension 0)
  *
  * @param geom a Puntal geometry to test
  * @return true if any point of the argument intersects the prepared geometry
  */
 protected boolean isAnyTestPointInTarget(Geometry testGeom) {
   /**
    * This could be optimized by using the segment index on the lineal target. However, it seems
    * like the L/P case would be pretty rare in practice.
    */
   PointLocator locator = new PointLocator();
   List coords = ComponentCoordinateExtracter.getCoordinates(testGeom);
   for (Iterator i = coords.iterator(); i.hasNext(); ) {
     Coordinate p = (Coordinate) i.next();
     if (locator.intersects(p, prepLine.getGeometry())) return true;
   }
   return false;
 }
Example #7
0
  /**
   * Build an appropriate <code>Geometry</code>, <code>MultiGeometry</code>, or <code>
   * GeometryCollection</code> to contain the <code>Geometry</code>s in it. For example:<br>
   *
   * <ul>
   *   <li>If <code>geomList</code> contains a single <code>Polygon</code>, the <code>Polygon</code>
   *       is returned.
   *   <li>If <code>geomList</code> contains several <code>Polygon</code>s, a <code>MultiPolygon
   *       </code> is returned.
   *   <li>If <code>geomList</code> contains some <code>Polygon</code>s and some <code>LineString
   *       </code>s, a <code>GeometryCollection</code> is returned.
   *   <li>If <code>geomList</code> is empty, an empty <code>GeometryCollection</code> is returned
   * </ul>
   *
   * Note that this method does not "flatten" Geometries in the input, and hence if any
   * MultiGeometries are contained in the input a GeometryCollection containing them will be
   * returned.
   *
   * @param geomList the <code>Geometry</code>s to combine
   * @return a <code>Geometry</code> of the "smallest", "most type-specific" class that can contain
   *     the elements of <code>geomList</code> .
   */
  public Geometry buildGeometry(Collection geomList) {

    /** Determine some facts about the geometries in the list */
    Class geomClass = null;
    boolean isHeterogeneous = false;
    boolean hasGeometryCollection = false;
    for (Iterator i = geomList.iterator(); i.hasNext(); ) {
      Geometry geom = (Geometry) i.next();
      Class partClass = geom.getClass();
      if (geomClass == null) {
        geomClass = partClass;
      }
      if (partClass != geomClass) {
        isHeterogeneous = true;
      }
      if (geom instanceof GeometryCollection) hasGeometryCollection = true;
    }

    /** Now construct an appropriate geometry to return */
    // for the empty geometry, return an empty GeometryCollection
    if (geomClass == null) {
      return createGeometryCollection(null);
    }
    if (isHeterogeneous || hasGeometryCollection) {
      return createGeometryCollection(toGeometryArray(geomList));
    }
    // at this point we know the collection is hetereogenous.
    // Determine the type of the result from the first Geometry in the list
    // this should always return a geometry, since otherwise an empty collection would have already
    // been returned
    Geometry geom0 = (Geometry) geomList.iterator().next();
    boolean isCollection = geomList.size() > 1;
    if (isCollection) {
      if (geom0 instanceof Polygon) {
        return createMultiPolygon(toPolygonArray(geomList));
      } else if (geom0 instanceof LineString) {
        return createMultiLineString(toLineStringArray(geomList));
      } else if (geom0 instanceof Point) {
        return createMultiPoint(toPointArray(geomList));
      }
      Assert.shouldNeverReachHere("Unhandled class: " + geom0.getClass().getName());
    }
    return geom0;
  }