@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 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 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 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 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 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); }
@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 testWrappingOn3DCRS() throws Exception { CoordinateReferenceSystem crs = CRS.decode("EPSG:4939", true); SingleCRS hcrs = CRS.getHorizontalCRS(crs); ReferencedEnvelope wgs84Envelope = new ReferencedEnvelope(-190, 60, -90, 45, hcrs); ProjectionHandler handler = ProjectionHandlerFinder.getHandler(wgs84Envelope, crs, true); assertNull(handler.validAreaBounds); List<ReferencedEnvelope> envelopes = handler.getQueryEnvelopes(); assertEquals(2, envelopes.size()); ReferencedEnvelope expected = new ReferencedEnvelope(170, 180, -90, 45, hcrs); assertTrue(envelopes.remove(wgs84Envelope)); assertEquals(expected, 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 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)); }
@Test public void testCutGeometryLambertConformal() throws Exception { // get a lambert conformal conic with ReferencedEnvelope wgs84South = new ReferencedEnvelope(-180, -90, -40, 0, WGS84); ReferencedEnvelope laeSouth = wgs84South.transform(CRS.decode("EPSG:2194"), true); ProjectionHandler handler = ProjectionHandlerFinder.getHandler(laeSouth, WGS84, true); // a Geometry that crosses the opposite of the central meridian Polygon geometry = JTS.toGeometry(new Envelope(5, 15, 0, 10)); Geometry preProcessed = handler.preProcess(geometry); assertTrue( "Should have sliced the geometry in two parts", preProcessed instanceof MultiPolygon); }
@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); }
@Test public void testQueryWrappingMercatorWorld() throws Exception { ReferencedEnvelope world = new ReferencedEnvelope(-200, 200, -89, 89, WGS84); ReferencedEnvelope mercatorEnvelope = world.transform(MERCATOR_SHIFTED, true); // get query area, we expect just one envelope spanning the whole world ProjectionHandler handler = ProjectionHandlerFinder.getHandler(mercatorEnvelope, WGS84, true); List<ReferencedEnvelope> envelopes = handler.getQueryEnvelopes(); assertEquals(1, envelopes.size()); ReferencedEnvelope env = envelopes.get(0); assertEquals(-180.0, env.getMinX(), EPS); assertEquals(180.0, env.getMaxX(), EPS); assertEquals(-85, env.getMinY(), 0.1); assertEquals(85.0, env.getMaxY(), 0.1); }
@Test public void testValidAreaMercator() throws Exception { ReferencedEnvelope world = new ReferencedEnvelope(-180, 180, -89.9999, 89.9999, WGS84); ReferencedEnvelope mercatorEnvelope = world.transform(MERCATOR_SHIFTED, true); // check valid area ProjectionHandler handler = ProjectionHandlerFinder.getHandler(mercatorEnvelope, WGS84, true); Envelope va = handler.validAreaBounds; assertNotNull(va); assertTrue(va.getMinX() <= -180.0); assertTrue(va.getMaxX() >= 180.0); assertTrue(-90 < va.getMinY()); assertTrue(90.0 > va.getMaxY()); }
@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 testValidAreaUTM() throws Exception { ReferencedEnvelope wgs84Envelope = new ReferencedEnvelope(8, 10, 40, 45, WGS84); ReferencedEnvelope utmEnvelope = wgs84Envelope.transform(UTM32N, true); // check valid area ProjectionHandler handler = ProjectionHandlerFinder.getHandler(utmEnvelope, WGS84, true); Envelope va = handler.validAreaBounds; assertNotNull(va); assertTrue(9 - 90 < va.getMinX() && va.getMinX() <= 9 - 3); assertTrue(9 + 3 <= va.getMaxX() && va.getMaxX() < 9 + 90); assertEquals(-85, va.getMinY(), EPS); assertEquals(85.0, va.getMaxY(), EPS); }
@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); }
@Test public void testWorldMeridian() throws Exception { ReferencedEnvelope requestWgs84 = new ReferencedEnvelope(-180, 180, -85, 85, WGS84); ReferencedEnvelope requestWebMercator = requestWgs84.transform(OSM, true); // a geometry close to the dateline Geometry g = new WKTReader().read("LINESTRING(0 -90, 0 90)"); Geometry expected = new WKTReader().read("LINESTRING(0 -85, 0 85)"); // make sure the geometry is not wrapped, but it is preserved ProjectionHandler handler = ProjectionHandlerFinder.getHandler(requestWebMercator, WGS84, true); assertTrue(handler.requiresProcessing(g)); Geometry preProcessed = handler.preProcess(g); // should have cut at 85 degrees, the web mercator breaks at the poles assertEquals(expected, preProcessed); // post process (provide identity transform to force wrap heuristic) Geometry postProcessed = handler.postProcess(CRS.findMathTransform(WGS84, WGS84), expected); // check the geometry is in the same area as the rendering envelope assertEquals(expected, postProcessed); }