Java源码示例:org.geotools.geometry.GeneralEnvelope

示例1
private static org.opengis.geometry.Envelope getIntersection(
    final org.opengis.geometry.Envelope originalEnvelope,
    final org.opengis.geometry.Envelope indexedEnvelope) {
  if (originalEnvelope == null) {
    return indexedEnvelope;
  }
  if (indexedEnvelope == null) {
    return originalEnvelope;
  }
  final int dimensions = originalEnvelope.getDimension();
  final double[] minDP = new double[dimensions];
  final double[] maxDP = new double[dimensions];
  for (int d = 0; d < dimensions; d++) {
    // to perform the intersection of the original envelope and the
    // indexed envelope, use the max of the mins per dimension and the
    // min of the maxes
    minDP[d] = Math.max(originalEnvelope.getMinimum(d), indexedEnvelope.getMinimum(d));
    maxDP[d] = Math.min(originalEnvelope.getMaximum(d), indexedEnvelope.getMaximum(d));
  }
  return new GeneralEnvelope(minDP, maxDP);
}
 
示例2
private void readGrass( File mapFile ) throws Exception {
    JGrassMapEnvironment mapEnvironment = new JGrassMapEnvironment(new File(file));
    CoordinateReferenceSystem crs = mapEnvironment.getCoordinateReferenceSystem();
    JGrassRegion readRegion = mapEnvironment.getFileRegion();
    double n = readRegion.getNorth();
    double s = readRegion.getSouth();
    double w = readRegion.getWest();
    double e = readRegion.getEast();

    Envelope env = readRegion.getEnvelope();
    originalEnvelope = new GeneralEnvelope(
            new ReferencedEnvelope(env.getMinX(), env.getMaxX(), env.getMinY(), env.getMaxY(), crs));

    // if bounds supplied, use them as region
    if (pBounds != null) {
        // n, s, w, e
        n = pBounds[0];
        s = pBounds[1];
        w = pBounds[2];
        e = pBounds[3];
    }
    if (pRes != null) {
        readRegion = new JGrassRegion(w, e, s, n, pRes[0], pRes[1]);
    }
    if (pRowcol != null) {
        readRegion = new JGrassRegion(w, e, s, n, pRowcol[0], pRowcol[1]);
    }

    if (!doEnvelope) {
        if (generalParameter == null) {
            generalParameter = createGridGeometryGeneralParameter(readRegion.getCols(), readRegion.getRows(),
                    readRegion.getNorth(), readRegion.getSouth(), readRegion.getEast(), readRegion.getWest(), crs);
        }
        GrassCoverageFormat format = new GrassCoverageFormatFactory().createFormat();
        GrassCoverageReader reader = format.getReader(mapEnvironment.getCELL());
        outRaster = (GridCoverage2D) reader.read(generalParameter);
        checkNovalues();
    }
}
 
示例3
public GridCoverage2D renderGridCoverage(
    final String coverageName,
    final Rectangle dim,
    final GeneralEnvelope generalEnvelope,
    Color backgroundColor,
    Color outputTransparentColor,
    final Interpolation interpolation) throws IOException {
  if (backgroundColor == null) {
    backgroundColor = AbstractGridFormat.BACKGROUND_COLOR.getDefaultValue();
  }
  if (outputTransparentColor == null) {
    outputTransparentColor = GeoWaveGTRasterFormat.OUTPUT_TRANSPARENT_COLOR.getDefaultValue();
  }

  final GeoWaveRasterReaderState state = new GeoWaveRasterReaderState(coverageName);
  state.setRequestedEnvelope(generalEnvelope);
  // /////////////////////////////////////////////////////////////////////
  //
  // Loading tiles trying to optimize as much as possible
  //
  // /////////////////////////////////////////////////////////////////////
  final GridCoverage2D coverage =
      loadTiles(
          coverageName,
          backgroundColor,
          outputTransparentColor,
          interpolation,
          dim,
          state,
          getCoordinateReferenceSystem(coverageName),
          getOriginalEnvelope(coverageName));

  return coverage;
}
 
示例4
private CloseableIterator<GridCoverage> queryForTiles(
    final Rectangle pixelDimension,
    final GeneralEnvelope requestEnvelope,
    final double levelResX,
    final double levelResY,
    final RasterDataAdapter adapter) throws IOException {
  final QueryConstraints query;
  if (requestEnvelope.getCoordinateReferenceSystem() != null) {
    query =
        new IndexOnlySpatialQuery(
            new GeometryFactory().toGeometry(
                new Envelope(
                    requestEnvelope.getMinimum(0),
                    requestEnvelope.getMaximum(0),
                    requestEnvelope.getMinimum(1),
                    requestEnvelope.getMaximum(1))),
            GeometryUtils.getCrsCode(requestEnvelope.getCoordinateReferenceSystem()));
  } else {
    query =
        new IndexOnlySpatialQuery(
            new GeometryFactory().toGeometry(
                new Envelope(
                    requestEnvelope.getMinimum(0),
                    requestEnvelope.getMaximum(0),
                    requestEnvelope.getMinimum(1),
                    requestEnvelope.getMaximum(1))));
  }
  return queryForTiles(
      adapter,
      query,
      new double[] {levelResX * adapter.getTileSize(), levelResY * adapter.getTileSize()});
}
 
示例5
protected void addSource( File imageMosaicSource ) throws Exception {

        URL imageMosaicUrl = imageMosaicSource.toURI().toURL();
        final AbstractGridFormat imageMosaicFormat = (AbstractGridFormat) GridFormatFinder.findFormat(imageMosaicUrl);
        final ImageMosaicReader imReader = (ImageMosaicReader) imageMosaicFormat.getReader(imageMosaicUrl);
        // ImageMosaicReader imReader = new ImageMosaicReader(imageMosaicSource);

        if (readers.size() == 0) {
            File propertiesFile = FileUtilities.substituteExtention(imageMosaicSource, "properties");
            HashMap<String, String> propertiesMap = FileUtilities.readFileToHashMap(propertiesFile.getAbsolutePath(), null,
                    false);

            String xyREs = propertiesMap.get("Levels");
            String[] split = xyREs.split(",");
            xRes = Double.parseDouble(split[0]);
            yRes = Double.parseDouble(split[1]);

            locationField = propertiesMap.get("LocationAttribute");
            crs = imReader.getCoordinateReferenceSystem();

            GeneralEnvelope originalEnvelope = imReader.getOriginalEnvelope();
            llCorner = originalEnvelope.getLowerCorner().getCoordinate();
            urCorner = originalEnvelope.getUpperCorner().getCoordinate();

            SimpleFeatureCollection vectorBounds = OmsVectorReader.readVector(imageMosaicSource.getAbsolutePath());
            boundsGeometries = FeatureUtilities.featureCollectionToGeometriesList(vectorBounds, true, locationField);

            Envelope singleTileEnv = boundsGeometries.get(0).getEnvelopeInternal();
            Envelope allTilesEnv = new Envelope();
            for( Geometry boundsGeometry : boundsGeometries ) {
                allTilesEnv.expandToInclude(boundsGeometry.getEnvelopeInternal());
            }
            if (allTilesEnv.getWidth() > singleTileEnv.getWidth()) {
                isSingleInX = false;
            }
            if (allTilesEnv.getHeight() > singleTileEnv.getHeight()) {
                isSingleInY = false;
            }

        }
        readers.add(imReader);
    }
 
示例6
@Override
public GeneralEnvelope getOriginalEnvelope() {
  throw new UnsupportedOperationException(
      "A coverage name must be provided, there is no support for a default coverage");
}
 
示例7
/**
 * transforms (if necessary) the requested envelope into the CRS used by this reader.
 *
 * @throws DataSourceException
 */
public static void transformRequestEnvelope(
    final GeoWaveRasterReaderState state,
    final CoordinateReferenceSystem crs) throws DataSourceException {

  if (CRS.equalsIgnoreMetadata(
      state.getRequestedEnvelope().getCoordinateReferenceSystem(),
      crs)) {
    state.setRequestEnvelopeXformed(state.getRequestedEnvelope());

    return; // and finish
  }

  try {
    /** Buffered factory for coordinate operations. */

    // transforming the envelope back to the dataset crs in
    final MathTransform transform =
        OPERATION_FACTORY.createOperation(
            state.getRequestedEnvelope().getCoordinateReferenceSystem(),
            crs).getMathTransform();

    if (transform.isIdentity()) { // Identity Transform ?
      state.setRequestEnvelopeXformed(state.getRequestedEnvelope());
      return; // and finish
    }

    state.setRequestEnvelopeXformed(CRS.transform(transform, state.getRequestedEnvelope()));
    state.getRequestEnvelopeXformed().setCoordinateReferenceSystem(crs);

    // if (config.getIgnoreAxisOrder() == false) { // check for axis
    // order
    // required
    final int indexX = indexOfX(crs);
    final int indexY = indexOfY(crs);
    final int indexRequestedX =
        indexOfX(state.getRequestedEnvelope().getCoordinateReferenceSystem());
    final int indexRequestedY =
        indexOfY(state.getRequestedEnvelope().getCoordinateReferenceSystem());

    // x Axis problem ???
    if ((indexX == indexRequestedY) && (indexY == indexRequestedX)) {
      state.setAxisSwap(true);
      final Rectangle2D tmp =
          new Rectangle2D.Double(
              state.getRequestEnvelopeXformed().getMinimum(1),
              state.getRequestEnvelopeXformed().getMinimum(0),
              state.getRequestEnvelopeXformed().getSpan(1),
              state.getRequestEnvelopeXformed().getSpan(0));
      state.setRequestEnvelopeXformed(new GeneralEnvelope(tmp));
      state.getRequestEnvelopeXformed().setCoordinateReferenceSystem(crs);
    } else if ((indexX == indexRequestedX) && (indexY == indexRequestedY)) {
      // everything is fine
    } else {
      throw new DataSourceException("Unable to resolve the X Axis problem");
    }
    // }
  } catch (final Exception e) {
    throw new DataSourceException("Unable to create a coverage for this source", e);
  }
}
 
示例8
/** @return the requestedEnvelope */
public GeneralEnvelope getRequestedEnvelope() {
  return requestedEnvelope;
}
 
示例9
/** @param requestedEnvelope the requestedEnvelope to set */
public void setRequestedEnvelope(final GeneralEnvelope requestedEnvelope) {
  this.requestedEnvelope = requestedEnvelope;
}
 
示例10
/** @return the requestEnvelopeXformed */
public GeneralEnvelope getRequestEnvelopeXformed() {
  return requestEnvelopeXformed;
}
 
示例11
/** @param requestEnvelopeXformed the requestEnvelopeXformed to set */
public void setRequestEnvelopeXformed(final GeneralEnvelope requestEnvelopeXformed) {
  this.requestEnvelopeXformed = requestEnvelopeXformed;
}
 
示例12
@Test
public void testMosaic() throws Exception {

  // Skip this test if we're on a Mac
  org.junit.Assume.assumeTrue(isNotMac());

  JAIExt.initJAIEXT();
  MapProjection.SKIP_SANITY_CHECKS = true;
  // just use the QA band as QA is the smallest, get the best cloud cover,
  // but ensure it is before now so no recent collection affects the test
  final Landsat8BasicCommandLineOptions analyzeOptions = new Landsat8BasicCommandLineOptions();
  analyzeOptions.setCqlFilter(
      String.format(
          "BBOX(%s,%f,%f,%f,%f) AND %s='B4' AND %s <= '%s' AND path >= %d AND path <= %d AND row >= %d AND row <= %d",
          SceneFeatureIterator.SHAPE_ATTRIBUTE_NAME,
          WEST,
          SOUTH,
          EAST,
          NORTH,
          BandFeatureIterator.BAND_ATTRIBUTE_NAME,
          SceneFeatureIterator.ACQUISITION_DATE_ATTRIBUTE_NAME,
          "2016-06-01T00:00:00Z",
          MIN_PATH,
          MAX_PATH,
          MIN_ROW,
          MAX_ROW));
  analyzeOptions.setNBestPerSpatial(true);
  analyzeOptions.setNBestScenes(1);
  analyzeOptions.setUseCachedScenes(true);
  final Landsat8DownloadCommandLineOptions downloadOptions =
      new Landsat8DownloadCommandLineOptions();
  final Landsat8RasterIngestCommandLineOptions ingestOptions =
      new Landsat8RasterIngestCommandLineOptions();
  ingestOptions.setRetainImages(true);
  ingestOptions.setCreatePyramid(true);
  ingestOptions.setCreateHistogram(true);
  ingestOptions.setCoverageName("test");
  // crop to the specified bbox
  ingestOptions.setCropToSpatialConstraint(true);
  final RasterIngestTester runner =
      new RasterIngestTester(
          dataStoreOptions,
          analyzeOptions,
          downloadOptions,
          ingestOptions,
          null);
  runner.runInternal(null);

  final StringBuilder str =
      new StringBuilder(StoreFactoryOptions.GEOWAVE_NAMESPACE_OPTION).append("=").append(
          dataStoreOptions.getGeoWaveNamespace()).append(
              ";equalizeHistogramOverride=false;interpolationOverride=").append(
                  Interpolation.INTERP_NEAREST);

  str.append(";").append(GeoWaveStoreFinder.STORE_HINT_KEY).append("=").append(
      dataStoreOptions.getType());

  final Map<String, String> options = dataStoreOptions.getOptionsAsMap();

  for (final Entry<String, String> entry : options.entrySet()) {
    if (!entry.getKey().equals(StoreFactoryOptions.GEOWAVE_NAMESPACE_OPTION)) {
      str.append(";").append(entry.getKey()).append("=").append(entry.getValue());
    }
  }
  final GeneralEnvelope queryEnvelope =
      new GeneralEnvelope(new double[] {WEST, SOUTH}, new double[] {EAST, NORTH});
  queryEnvelope.setCoordinateReferenceSystem(GeometryUtils.getDefaultCRS());

  final GeoWaveRasterReader reader =
      new GeoWaveRasterReader(GeoWaveRasterConfig.readFromConfigParams(str.toString()));
  final GridCoverage2D gridCoverage =
      reader.renderGridCoverage(
          "test",
          new Rectangle(0, 0, 1024, 1024),
          queryEnvelope,
          null,
          null,
          null);
  final RenderedImage result = gridCoverage.getRenderedImage();

  // test the result with expected, allowing for minimal error
  final BufferedImage reference = ImageIO.read(new File(REFERENCE_LANDSAT_IMAGE_PATH));
  TestUtils.testTileAgainstReference(
      PlanarImage.wrapRenderedImage(result).getAsBufferedImage(),
      reference,
      0,
      0.005);
  MapProjection.SKIP_SANITY_CHECKS = false;
}
 
示例13
private double[][][] testSamplesMatch(
    final String coverageNamePrefix,
    final int numCoverages,
    final GeneralEnvelope queryEnvelope,
    final Rectangle pixelDimensions,
    double[][][] expectedResults) throws Exception {
  final StringBuilder str =
      new StringBuilder(StoreFactoryOptions.GEOWAVE_NAMESPACE_OPTION).append("=").append(
          TEST_COVERAGE_NAMESPACE).append(
              ";equalizeHistogramOverride=false;scaleTo8Bit=false;interpolationOverride=").append(
                  Interpolation.INTERP_NEAREST);

  str.append(";").append(GeoWaveStoreFinder.STORE_HINT_KEY).append("=").append(
      outputDataStorePluginOptions.getType());

  final Map<String, String> options = outputDataStorePluginOptions.getOptionsAsMap();

  for (final Entry<String, String> entry : options.entrySet()) {
    if (!entry.getKey().equals(StoreFactoryOptions.GEOWAVE_NAMESPACE_OPTION)) {
      str.append(";").append(entry.getKey()).append("=").append(entry.getValue());
    }
  }

  final GeoWaveRasterReader reader =
      new GeoWaveRasterReader(GeoWaveRasterConfig.readFromConfigParams(str.toString()));

  queryEnvelope.setCoordinateReferenceSystem(CRS.decode("EPSG:4166", true));
  final Raster[] rasters = new Raster[numCoverages];
  int coverageCount = 0;
  for (int i = MIN_TILE_SIZE_POWER_OF_2; i <= MAX_TILE_SIZE_POWER_OF_2; i += INCREMENT) {
    final String tileSizeCoverageName = coverageNamePrefix + i;
    final GridCoverage gridCoverage =
        reader.renderGridCoverage(
            tileSizeCoverageName,
            pixelDimensions,
            queryEnvelope,
            Color.BLACK,
            null,
            null);
    final RenderedImage image = gridCoverage.getRenderedImage();
    final Raster raster = image.getData();
    rasters[coverageCount++] = raster;
  }
  boolean atLeastOneResult = expectedResults != null;
  for (int i = 0; i < numCoverages; i++) {
    final boolean initialResults = expectedResults == null;
    if (initialResults) {
      expectedResults =
          new double[rasters[i].getWidth()][rasters[i].getHeight()][rasters[i].getNumBands()];
    } else {
      Assert.assertEquals(
          "The expected width does not match the expected width for the coverage " + i,
          expectedResults.length,
          rasters[i].getWidth());
      Assert.assertEquals(
          "The expected height does not match the expected height for the coverage " + i,
          expectedResults[0].length,
          rasters[i].getHeight());
      Assert.assertEquals(
          "The expected number of bands does not match the expected bands for the coverage " + i,
          expectedResults[0][0].length,
          rasters[i].getNumBands());
    }
    long mismatchedSamples = 0;
    for (int y = 0; y < rasters[i].getHeight(); y++) {
      for (int x = 0; x < rasters[i].getWidth(); x++) {
        for (int b = 0; b < rasters[i].getNumBands(); b++) {
          final double sample = rasters[i].getSampleDouble(x, y, b);
          if (initialResults) {
            expectedResults[x][y][b] = sample;
            if (!atLeastOneResult && (sample != 0)) {
              atLeastOneResult = true;
            }
          } else {
            if ((Double.isNaN(sample) && !Double.isNaN(expectedResults[x][y][b]))
                || (!Double.isNaN(sample) && Double.isNaN(expectedResults[x][y][b]))
                || (Math.abs(expectedResults[x][y][b] - sample) > TestUtils.DOUBLE_EPSILON)) {
              mismatchedSamples++;
            }
          }
        }
      }
    }
    final double percentMismatch =
        mismatchedSamples
            / (double) (rasters[i].getWidth()
                * rasters[i].getHeight()
                * rasters[i].getNumBands());
    Assert.assertTrue(
        (percentMismatch * 100) + "% mismatch is less than 1%",
        percentMismatch < 0.01);
  }
  Assert.assertTrue("There should be at least one value that is not black", atLeastOneResult);
  return expectedResults;
}