Пример #1
0
 void assertEqualsExact(Geometry g1, Geometry g2, String msg) {
   Geometry g1Clone = (Geometry) g1.clone();
   Geometry g2Clone = (Geometry) g2.clone();
   g1Clone.normalize();
   g2Clone.normalize();
   assertTrue(g1Clone.equalsExact(g2Clone), msg);
 }
Пример #2
0
 void checkTransformation(String geomStr)
     throws IOException, ParseException, NoninvertibleTransformationException {
   Geometry geom = rdr.read(geomStr);
   AffineTransformation trans = AffineTransformation.rotationInstance(Math.PI / 2);
   AffineTransformation inv = trans.getInverse();
   Geometry transGeom = (Geometry) geom.clone();
   transGeom.apply(trans);
   // System.out.println(transGeom);
   transGeom.apply(inv);
   // check if transformed geometry is equal to original
   boolean isEqual = geom.equalsExact(transGeom, 0.0005);
   assertTrue(isEqual);
 }
  private void setCurrentFeature(final Feature feature) {
    this.feature = feature;
    this.geometry = null;
    this.subGeometries.clear();

    if (feature != null) {
      this.geometry = helper.toObjectiveCRS(feature);
      if (geometry != null) {
        geometry.clone();
        multipolygon = (geometry instanceof MultiPolygon);
        for (int i = 0; i < geometry.getNumGeometries(); i++) {
          subGeometries.add(geometry.getGeometryN(i));
        }
      }
    }
    decoration.setGeometries(Collections.singleton(this.geometry));
  }
  /**
   * Quick method for populating the {@link CUDABean} instance provided.
   *
   * @param bean
   * @param reference
   * @param coverage
   * @param geo
   * @param transform
   * @throws IOException
   * @throws MismatchedDimensionException
   * @throws TransformException
   */
  private void populateBean(
      CUDABean bean,
      boolean reference,
      GridCoverage2D coverage,
      Geometry geo,
      MathTransform transform,
      int buffer)
      throws IOException, MismatchedDimensionException, TransformException {

    RenderedImage image = coverage.getRenderedImage();

    // 0) Check if a buffer must be applied
    Geometry originalGeo = (Geometry) geo.clone();
    if (buffer > 0) {
      try {
        if (!"EPSG:4326"
            .equals(CRS.lookupIdentifier(coverage.getCoordinateReferenceSystem(), false))) {
          geo = geo.buffer(buffer);
        } else {
          geo = geo.buffer(buffer / 111.128);
        }
      } catch (FactoryException e) {
        geo = geo.buffer(buffer);
      }
    }

    // 1) Crop the two coverages with the selected Geometry
    GridCoverage2D crop = CROP.execute(coverage, geo, null);
    transform =
        ProjectiveTransform.create(
                (AffineTransform) crop.getGridGeometry().getGridToCRS(PixelInCell.CELL_CORNER))
            .inverse();

    // 2) Extract the BufferedImage from each image
    image = crop.getRenderedImage();

    Rectangle rectIMG =
        new Rectangle(image.getMinX(), image.getMinY(), image.getWidth(), image.getHeight());
    ImageWorker w = new ImageWorker(image);
    BufferedImage buf = w.getBufferedImage();
    if (image instanceof RenderedOp) {
      ((RenderedOp) image).dispose();
    }

    // 3) Generate an array of data from each image
    Raster data = buf.getData();
    final DataBufferByte db = (DataBufferByte) data.getDataBuffer();
    byte[] byteData = db.getData();

    if (reference) {
      // 4) Transform the Geometry to Raster space
      Geometry rs = JTS.transform(geo, transform);
      Geometry rsFilter = JTS.transform(geo.difference(originalGeo), transform);
      ROI roiGeo = new ROIGeometry(rs);
      ROI roiFilter = new ROIGeometry(rsFilter);

      // 5) Extract an array of data from the transformed ROI
      byte[] roiData = getROIData((buffer > 0 ? roiFilter : roiGeo), rectIMG);
      bean.setRoi(roiData);
      bean.setRoiObj(roiGeo);

      // 6) Setting the Coverage data array
      bean.setReferenceImage(byteData);

      // 7) Setting the Image dimensions
      bean.setHeight(rectIMG.height);
      bean.setWidth(rectIMG.width);
      bean.setMinX(rectIMG.x);
      bean.setMinY(rectIMG.y);
    } else {
      // 6) Setting the Coverage data array
      bean.setCurrentImage(byteData);
    }

    // 7) Store the Reference Covergae containing the geospatial info
    bean.setReferenceCoverage(coverage);
  }
Пример #5
0
  /**
   * Performs a deep copy of the provided object.
   *
   * @param src Source object
   * @return copy of source object
   */
  public static Object duplicate(Object src) {
    // JD: this method really needs to be replaced with somethign better

    if (src == null) {
      return null;
    }

    //
    // The following are things I expect
    // Features will contain.
    //
    if (src instanceof String
        || src instanceof Integer
        || src instanceof Double
        || src instanceof Float
        || src instanceof Byte
        || src instanceof Boolean
        || src instanceof Short
        || src instanceof Long
        || src instanceof Character
        || src instanceof Number) {
      return src;
    }

    if (src instanceof Date) {
      return new Date(((Date) src).getTime());
    }

    if (src instanceof URL || src instanceof URI) {
      return src; // immutable
    }

    if (src instanceof Object[]) {
      Object[] array = (Object[]) src;
      Object[] copy = new Object[array.length];

      for (int i = 0; i < array.length; i++) {
        copy[i] = duplicate(array[i]);
      }

      return copy;
    }

    if (src instanceof Geometry) {
      Geometry geometry = (Geometry) src;

      return geometry.clone();
    }

    if (src instanceof SimpleFeature) {
      SimpleFeature feature = (SimpleFeature) src;
      return SimpleFeatureBuilder.copy(feature);
    }

    //
    // We are now into diminishing returns
    // I don't expect Features to contain these often
    // (eveything is still nice and recursive)
    //
    Class<? extends Object> type = src.getClass();

    if (type.isArray() && type.getComponentType().isPrimitive()) {
      int length = Array.getLength(src);
      Object copy = Array.newInstance(type.getComponentType(), length);
      System.arraycopy(src, 0, copy, 0, length);

      return copy;
    }

    if (type.isArray()) {
      int length = Array.getLength(src);
      Object copy = Array.newInstance(type.getComponentType(), length);

      for (int i = 0; i < length; i++) {
        Array.set(copy, i, duplicate(Array.get(src, i)));
      }

      return copy;
    }

    if (src instanceof List) {
      List list = (List) src;
      List<Object> copy = new ArrayList<Object>(list.size());

      for (Iterator i = list.iterator(); i.hasNext(); ) {
        copy.add(duplicate(i.next()));
      }

      return Collections.unmodifiableList(copy);
    }

    if (src instanceof Map) {
      Map map = (Map) src;
      Map copy = new HashMap(map.size());

      for (Iterator i = map.entrySet().iterator(); i.hasNext(); ) {
        Map.Entry entry = (Map.Entry) i.next();
        copy.put(entry.getKey(), duplicate(entry.getValue()));
      }

      return Collections.unmodifiableMap(copy);
    }

    //
    // I have lost hope and am returning the orgional reference
    // Please extend this to support additional classes.
    //
    // And good luck getting Cloneable to work
    throw new IllegalAttributeException(null, "Do not know how to deep copy " + type.getName());
  }
 @Override
 public void setFeatureGeom(Geometry geometryValue) {
   super.setFeatureGeom((Geometry) geometryValue.clone());
   this.geomPolygon = GeometryUtility.getWkbFromGeometry(geometryValue);
   propertySupport.firePropertyChange(FEATURE_GEOM_PROPERTY, null, geometryValue);
 }