/** * Provides the strategy with the area we want to render and its CRS (the SPI lookup will do * this step) * * @throws FactoryException */ public WrappingProjectionHandler( ReferencedEnvelope renderingEnvelope, ReferencedEnvelope validArea, CoordinateReferenceSystem sourceCrs, double centralMeridian, int maxWraps) throws FactoryException { super(sourceCrs, validArea, renderingEnvelope); this.maxWraps = maxWraps; // if we are wrapping, we query across the dateline no matter what this.queryAcrossDateline = true; // this will compute the radius setCentralMeridian(centralMeridian); }
protected void accumulateTransforms(MathTransform mt, List<MathTransform> elements) { if (mt instanceof ConcatenatedTransform) { ConcatenatedTransform ct = (ConcatenatedTransform) mt; accumulateTransforms(ct.transform1, elements); accumulateTransforms(ct.transform2, elements); } else { elements.add(mt); } }
private void addTransformedEnvelope(ReferencedEnvelope re, List<ReferencedEnvelope> envelopes) throws TransformException, FactoryException { ReferencedEnvelope transformed = transformEnvelope(re, sourceCRS); if (transformed != null) { envelopes.add(transformed); } }
private ReferencedEnvelope reprojectBounds( ReferencedEnvelope referenceBounds, CoordinateReferenceSystem targetCRS, ReferencedEnvelope bounds) throws FactoryException, TransformException { ProjectionHandler ph = ProjectionHandlerFinder.getHandler(referenceBounds, targetCRS, true); ReferencedEnvelope targetBounds = null; if (ph != null) { List<ReferencedEnvelope> queryEnvelopes = ph.getQueryEnvelopes(); for (ReferencedEnvelope envelope : queryEnvelopes) { ReferencedEnvelope transformed = envelope.transform(targetCRS, true); if (targetBounds == null) { targetBounds = transformed; } else { targetBounds.expandToInclude(transformed); } } } else { targetBounds = bounds.transform(targetCRS, true); } return targetBounds; }
@Test public void testQueryEnvelopesNonWrapping3857() throws Exception { // dateline crossing request ReferencedEnvelope requestWgs84 = new ReferencedEnvelope(170, 190, -40, 40, WGS84); ReferencedEnvelope request = requestWgs84.transform(OSM, true); // grab a non wrapping handler ProjectionHandler handler = ProjectionHandlerFinder.getHandler(request, WGS84, false); List<ReferencedEnvelope> envelopes = handler.getQueryEnvelopes(); assertEquals(1, envelopes.size()); assertEnvelopesEqual(requestWgs84, envelopes.get(0), EPS); }
@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())); }
@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); }
/** * Returns a projection handler for the specified rendering area, or null if not found * * @param renderingArea The area to be painted (mind, the CRS must be property set for * projection handling to work) * @param wrap Enable continuous map wrapping if it's possible for the current projection * @throws FactoryException */ public static ProjectionHandler getHandler( ReferencedEnvelope renderingArea, CoordinateReferenceSystem sourceCrs, boolean wrap) throws FactoryException { if (renderingArea.getCoordinateReferenceSystem() == null) return null; for (ProjectionHandlerFactory factory : getProjectionHandlerFactories()) { ProjectionHandler handler = factory.getHandler(renderingArea, sourceCrs, wrap, WRAP_LIMIT); if (handler != null) return handler; } return null; } }
public MathTransform inverse() throws NoninvertibleTransformException { MathTransform inverse = delegate.inverse(); if (inverse instanceof GeographicOffsetWrapper) { return inverse; } else { return new GeographicOffsetWrapper(inverse); } }
@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 testQueryEnvelopesWrapping3857() throws Exception { // dateline crossing request ReferencedEnvelope requestWgs84 = new ReferencedEnvelope(170, 190, -40, 40, WGS84); ReferencedEnvelope request = requestWgs84.transform(OSM, true); // grab a non wrapping handler ProjectionHandler handler = ProjectionHandlerFinder.getHandler(request, WGS84, true); List<ReferencedEnvelope> envelopes = handler.getQueryEnvelopes(); assertEquals(2, envelopes.size()); assertEnvelopesEqual( new ReferencedEnvelope(170, 180, -40, 40, WGS84), envelopes.get(0), EPS); assertEnvelopesEqual( new ReferencedEnvelope(-180, -170, -40, 40, WGS84), envelopes.get(1), EPS); }
protected void reprojectEnvelopes( CoordinateReferenceSystem queryCRS, List<ReferencedEnvelope> envelopes) throws TransformException, FactoryException { // reproject the surviving envelopes for (int i = 0; i < envelopes.size(); i++) { final ReferencedEnvelope envelope = transformEnvelope(envelopes.get(i), queryCRS); if (envelope != null) { envelopes.set(i, envelope); } } }
@Test public void testQueryEnvelopesNonWrappingWGS84() throws Exception { // dateline crossing request ReferencedEnvelope request = new ReferencedEnvelope(170, 190, -40, 40, WGS84); // grab a non wrapping handler ProjectionHandler handler = ProjectionHandlerFinder.getHandler(request, WGS84, false); List<ReferencedEnvelope> envelopes = handler.getQueryEnvelopes(); assertEquals(1, envelopes.size()); assertEquals(request, envelopes.get(0)); }
@Test public void testWGS84BackToWebMercator() throws Exception { ReferencedEnvelope renderingEnvelope = new ReferencedEnvelope(135, 180, -90, -45, WGS84); ProjectionHandler handler = ProjectionHandlerFinder.getHandler(renderingEnvelope, OSM, true); assertNotNull(handler); List<ReferencedEnvelope> queryEnvelopes = handler.getQueryEnvelopes(); assertEquals(1, queryEnvelopes.size()); ReferencedEnvelope expected = new ReferencedEnvelope( 1.5028131257091932E7, 2.0037508342789244E7, -1.9971868880408555E7, -5621521.486192067, OSM); assertEnvelopesEqual(expected, queryEnvelopes.get(0), EPS); }
@Test public void testQueryOutsideValidArea() throws Exception { ReferencedEnvelope world = new ReferencedEnvelope(-200, 200, -89, -86, WGS84); ReferencedEnvelope mercatorEnvelope = world.transform(MERCATOR_SHIFTED, true); ProjectionHandler handler = ProjectionHandlerFinder.getHandler(mercatorEnvelope, WGS84, true); List<ReferencedEnvelope> envelopes = handler.getQueryEnvelopes(); assertEquals(0, envelopes.size()); }
@Test public void testQueryEnvelopesWrappingWGS84() throws Exception { // dateline crossing request ReferencedEnvelope request = new ReferencedEnvelope(170, 190, -40, 40, WGS84); // grab a non wrapping handler ProjectionHandler handler = ProjectionHandlerFinder.getHandler(request, WGS84, true); List<ReferencedEnvelope> envelopes = handler.getQueryEnvelopes(); assertEquals(2, envelopes.size()); assertTrue(envelopes.contains(new ReferencedEnvelope(170, 180, -40, 40, WGS84))); assertTrue(envelopes.contains(new ReferencedEnvelope(-180, -170, -40, 40, WGS84))); }
@Test public void testQueryEnvelopeOnInvalidArea2() 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); ReferencedEnvelope re3857 = re.transform(CRS.decode("EPSG:3857", true), true); ProjectionHandler ph = ProjectionHandlerFinder.getHandler(re3857, CRS.decode("EPSG:3003", true), true); List<ReferencedEnvelope> queryEnvelopes = ph.getQueryEnvelopes(); assertEquals(0, queryEnvelopes.size()); }
@Test public void testQueryWrappingWGS84() throws Exception { ReferencedEnvelope wgs84Envelope = new ReferencedEnvelope(-190, 60, -90, 45, WGS84); ProjectionHandler handler = ProjectionHandlerFinder.getHandler(wgs84Envelope, WGS84, true); assertNull(handler.validAreaBounds); List<ReferencedEnvelope> envelopes = handler.getQueryEnvelopes(); assertEquals(2, envelopes.size()); ReferencedEnvelope expected = new ReferencedEnvelope(170, 180, -90, 45, WGS84); assertTrue(envelopes.remove(wgs84Envelope)); assertEquals(expected, envelopes.get(0)); }
@Test public void testQueryWrappingED50LatLon() throws Exception { ReferencedEnvelope envelope = new ReferencedEnvelope(-90, 45, -190, 60, ED50_LATLON); ProjectionHandler handler = ProjectionHandlerFinder.getHandler(envelope, ED50_LATLON, true); assertNull(handler.validAreaBounds); List<ReferencedEnvelope> envelopes = handler.getQueryEnvelopes(); assertEquals(2, envelopes.size()); ReferencedEnvelope expected = new ReferencedEnvelope(-90, 45, 170, 180, ED50_LATLON); assertTrue(envelopes.remove(envelope)); assertEquals(expected, envelopes.get(0)); }
@Test public void testQueryUTM() throws Exception { ReferencedEnvelope wgs84Envelope = new ReferencedEnvelope(8, 10, 40, 45, WGS84); ReferencedEnvelope utmEnvelope = wgs84Envelope.transform(UTM32N, true); // get query area, we expect just one envelope, the original one ProjectionHandler handler = ProjectionHandlerFinder.getHandler(utmEnvelope, WGS84, true); ReferencedEnvelope expected = utmEnvelope.transform(WGS84, true); List<ReferencedEnvelope> envelopes = handler.getQueryEnvelopes(); assertEquals(1, envelopes.size()); assertEquals(expected, envelopes.get(0)); }