@Test public void testQueryEnvelopeOnInvalidArea() throws Exception { // and Envelope that does not make sense for EPSG:3003, too far away from central meridian ReferencedEnvelope re = new ReferencedEnvelope(-130, -120, -40, 30, DefaultGeographicCRS.WGS84); ProjectionHandler ph = ProjectionHandlerFinder.getHandler(re, CRS.decode("EPSG:3003", true), true); List<ReferencedEnvelope> queryEnvelopes = ph.getQueryEnvelopes(); assertEquals(0, queryEnvelopes.size()); }
@Test public void testWrapGeometryLatLonMultipleTimes() throws Exception { ReferencedEnvelope renderingEnvelope = new ReferencedEnvelope(-90, 90, -580, 540, ED50_LATLON); // a geometry close to the dateline Geometry g = new WKTReader().read("POLYGON((-74 -33, -29 -33, -29 5, -74 5, -74 -33))"); // make sure the geometry is not wrapped, but it is preserved ProjectionHandler handler = ProjectionHandlerFinder.getHandler(renderingEnvelope, WGS84, true); assertTrue(handler.requiresProcessing(g)); Geometry preProcessed = handler.preProcess(g); MathTransform mt = handler.getRenderingTransform(CRS.findMathTransform(WGS84, ED50_LATLON)); Geometry transformed = JTS.transform(preProcessed, mt); // post process (provide identity transform to force wrap heuristic) Geometry postProcessed = handler.postProcess(mt, transformed); assertTrue(postProcessed.isValid()); // should have been replicated three times assertEquals(3, postProcessed.getNumGeometries()); }
boolean isAccurateResolutionComputationSafe(ReferencedEnvelope readEnvelope) throws MismatchedDimensionException, FactoryException, TransformException { // accurate resolution computation depends on reprojection working, we need // to make sure the read envelope is sane for the source data at hand CoordinateReferenceSystem readCRS = readEnvelope.getCoordinateReferenceSystem(); ProjectionHandler handler = ProjectionHandlerFinder.getHandler( new ReferencedEnvelope(readCRS), DefaultGeographicCRS.WGS84, true); if (handler != null) { // if there are no limits or the projection is periodic, assume it's fine to read // whatever if (handler.getValidAreaBounds() == null || handler instanceof WrappingProjectionHandler) { return true; } // in this case we need to make sure the area is actually safe to perform reprojections // on try { // when assertions are enabled accuracy tests might fail this path ReferencedEnvelope validBounds = handler.getValidAreaBounds().transform(readCRS, true); return validBounds.contains((Envelope) readEnvelope); } catch (Exception e) { return false; } } else { return false; } }
protected List<ReferencedEnvelope> getSourceEnvelopes(ReferencedEnvelope renderingEnvelope) throws TransformException, FactoryException { ReferencedEnvelope re = transformEnvelope(renderingEnvelope, WGS84); if (re == null) { return Collections.emptyList(); final ReferencedEnvelope result = transformEnvelope(renderingEnvelope, sourceCRS); if (result != null) { return Collections.singletonList(result); re.getCoordinateReferenceSystem())); mergeEnvelopes(envelopes); reprojectEnvelopes(sourceCRS, envelopes); return envelopes.stream().filter(e -> e != null).collect(Collectors.toList());
CoordinateReferenceSystem renderingCRS = renderingEnvelope.getCoordinateReferenceSystem(); if (!queryAcrossDateline) { return Collections.singletonList(transformEnvelope(renderingEnvelope, sourceCRS)); addTransformedEnvelope(re, envelopes); if (CRS.getAxisOrder(renderingCRS) == CRS.AxisOrder.NORTH_EAST) { if (re.getMinY() >= -180.0 && re.getMaxY() <= 180) { Math.min(re.getMaxY() + 360, 180), re.getCoordinateReferenceSystem()); addTransformedEnvelope(envelope, envelopes); re.getMaxY() - 360, re.getCoordinateReferenceSystem()); addTransformedEnvelope(envelope, envelopes); transformEnvelope(renderingEnvelope, sourceCRS)); re.getMaxY(), re.getCoordinateReferenceSystem()); addTransformedEnvelope(envelope, envelopes); re.getMaxY(), re.getCoordinateReferenceSystem()); addTransformedEnvelope(envelope, envelopes); mergeEnvelopes(envelopes); return envelopes; } else {
maxWraps); } else { handler = new ProjectionHandler(sourceCrs, VALID_AREA, renderingEnvelope); handler.setCentralMeridian(centralMeridian);
@Test public void testWrapJumpLast() throws Exception { ReferencedEnvelope world = new ReferencedEnvelope(-180, 180, -90, 90, WGS84); Geometry g = new WKTReader().read("POLYGON((-131 -73.5,0 -90,163 -60,174 -60,-131 -73.5))"); Geometry original = new WKTReader().read("POLYGON((-131 -73.5,0 -90,163 -60,174 -60,-131 -73.5))"); // make sure the geometry is not wrapped, but it is preserved ProjectionHandler handler = ProjectionHandlerFinder.getHandler(world, WGS84, true); assertTrue(handler.requiresProcessing(g)); Geometry preProcessed = handler.preProcess(g); // no cutting expected assertEquals(original, preProcessed); // post process (provide identity transform to force wrap heuristic) Geometry postProcessed = handler.postProcess(CRS.findMathTransform(WGS84, WGS84), g); // check the geometry is in the same area as the rendering envelope assertEquals(original, postProcessed); }
MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS); Geometry footprint = JTS.toGeometry(sourceEnvelope); Geometry preProcessed = handler.preProcess(footprint); if (preProcessed == null) { return null; Geometry postProcessed = handler.postProcess(transform.inverse(), transformed); if (postProcessed == null) { return null;
private ReferencedEnvelope reduceEnvelope( ReferencedEnvelope envelope, ProjectionHandler handler) throws TransformException, FactoryException { Polygon polygon = JTS.toGeometry(envelope); Geometry geom = handler.preProcess(polygon); if (geom == null) { return null; } PolygonExtractor pe = new PolygonExtractor(); Polygon largest = null; for (Polygon p : pe.getPolygons(geom)) { if (largest == null || largest.getArea() > p.getArea()) { largest = p; } } ReferencedEnvelope reduced = new ReferencedEnvelope( largest.getEnvelopeInternal(), envelope.getCoordinateReferenceSystem()); return reduced; }
new ReferencedEnvelope(-180, 180, 0, 90, DefaultGeographicCRS.WGS84); ProjectionHandler ph = new ProjectionHandler( DefaultGeographicCRS.WGS84, validAreaBounds, renderingEnvelope); Geometry preProcessed = ph.preProcess(geometry); assertNull(preProcessed);
@Test public void testSkipEmptyGeometryCollections() throws Exception { ReferencedEnvelope world = new ReferencedEnvelope(160, 180, -40, 40, WGS84); ReferencedEnvelope mercatorEnvelope = world.transform(MERCATOR, true); // move it so that it crosses the dateline (measures are still accurate for something // crossing the dateline mercatorEnvelope.translate(mercatorEnvelope.getWidth() / 2, 0); // a geometry that will cross the dateline and sitting in the same area as the // rendering envelope Geometry g1 = new WKTReader() .read( "POLYGON((150 40, 150 -90, 190 -90, 190 40, 175 40, 175 -87, 165 -87, 165 40, 150 40))"); // Empty geometry collection Geometry collection = new GeometryCollection(null, g1.getFactory()); // make sure the geometry is not wrapped ProjectionHandler handler = new ProjectionHandler( WGS84, new Envelope(-0.5d, 2.0d, -0.5d, 2.0d), mercatorEnvelope); assertTrue(handler.requiresProcessing(collection)); Geometry preProcessed = handler.preProcess(collection); // Ensure something has changed assertNotEquals(collection, preProcessed); // Ensure the result is null assertNull(preProcessed); }
@Test public void testCutGeometryUTM() throws Exception { ReferencedEnvelope wgs84Envelope = new ReferencedEnvelope(8, 10, 40, 45, WGS84); ReferencedEnvelope utmEnvelope = wgs84Envelope.transform(UTM32N, true); // a geometry that will definitely go outside of the UTM32N valid area Geometry g = new WKTReader().read("LINESTRING(-170 -40, 170 40)"); ProjectionHandler handler = ProjectionHandlerFinder.getHandler(utmEnvelope, WGS84, true); assertTrue(handler.requiresProcessing(g)); Geometry preProcessed = handler.preProcess(g); assertTrue(!preProcessed.equalsTopo(g)); assertTrue(handler.validAreaBounds.contains(preProcessed.getEnvelopeInternal())); }
public ProjectionHandler getHandler( ReferencedEnvelope renderingEnvelope, CoordinateReferenceSystem sourceCrs, boolean wrap, int maxWraps) throws FactoryException { if (renderingEnvelope == null) { return null; } MapProjection mapProjection = CRS.getMapProjection(renderingEnvelope.getCoordinateReferenceSystem()); if (mapProjection instanceof WorldVanDerGrintenI) { ReferencedEnvelope validArea = new ReferencedEnvelope( -Integer.MAX_VALUE, Integer.MAX_VALUE, -90, 90, DefaultGeographicCRS.WGS84); return new ProjectionHandler(sourceCrs, validArea, renderingEnvelope); } return null; } }
public CapabilitiesTransformerProjectionHandler(ProjectionHandler handler) throws FactoryException { super(handler.getSourceCRS(), handler.getValidAreaBounds(), handler.getRenderingEnvelope()); }
if (reprojectionNeeded && handler != null && handler.getValidAreaBounds() != null) { List<GridCoverage2D> cropped = new ArrayList<>(); ReferencedEnvelope validArea = handler.getValidAreaBounds(); GridGeometryReducer reducer = new GridGeometryReducer(validArea); for (GridCoverage2D coverage : coverages) { Geometry postProcessed = handler.postProcess(mt, polygon);
if (projectionHandler != null) { projectionHandler.setRenderingEnvelope(envelope); envelopes = projectionHandler.getQueryEnvelopes(featCrs); } else { if (mapCRS != null && featCrs != null && !CRS.equalsIgnoreMetadata(featCrs, mapCRS)) {
DefaultGeographicCRS.WGS84); ProjectionHandler ph = new ProjectionHandler(sourceCrs, validArea, renderingEnvelope); if ((validArea.getMinX() < 180 && validArea.getMaxX() > 180) || (validArea.getMinX() < -180 && validArea.getMaxX() > -180)) { ph.computeDatelineX();
private void addTransformedEnvelope(ReferencedEnvelope re, List<ReferencedEnvelope> envelopes) throws TransformException, FactoryException { ReferencedEnvelope transformed = transformEnvelope(re, sourceCRS); if (transformed != null) { envelopes.add(transformed); } }
@Test public void testPolarStereographic() throws Exception { ReferencedEnvelope envelope = new ReferencedEnvelope( -10700000, 14700000, -10700000, 14700000, CRS.decode("EPSG:5041", true)); ProjectionHandler handler = ProjectionHandlerFinder.getHandler(envelope, WGS84, true); assertNotNull(handler); assertEquals(envelope, handler.getRenderingEnvelope()); assertTrue( CRS.getMapProjection(envelope.getCoordinateReferenceSystem()) instanceof PolarStereographic); }
sa.axform = atTransform; if (projectionHandler != null) { sa.rxform = projectionHandler.getRenderingTransform(sa.crsxform); } else { sa.rxform = sa.crsxform;