/** * Checks whether or not the longitudes of this geo-coding cross the +/- 180 degree meridian. * * @return <code>true</code>, if so */ @Override public boolean isCrossingMeridianAt180() { return getGeoCoding().isCrossingMeridianAt180(); }
/** * Computes an estimation of the memory required to create an instance of this class for the given product. * The estimation is returned in bytes. * * @return an estimation of the required memory in bytes */ public static long getRequiredMemory(Product product, boolean usesValidMask) { final GeoCoding geoCoding = product.getGeoCoding(); if (geoCoding == null) { return 0; } final long sizeofFloat = 4; final long pixelCount = product.getSceneRasterWidth() * product.getSceneRasterHeight(); // lat + lon band converted to 32-bit float tie-point data long size = 2 * sizeofFloat * pixelCount; if (geoCoding.isCrossingMeridianAt180()) { // additional 32-bit float sine and cosine grids for to lon grid size += 2 * sizeofFloat * pixelCount; } if (usesValidMask) { // additional 1-bit data mask size += pixelCount / 8; } return size; }
private static Rectangle2D createMapBoundary(final Product product, CoordinateReferenceSystem targetCrs) { try { final CoordinateReferenceSystem sourceCrs = product.getGeoCoding().getImageCRS(); final int sourceW = product.getSceneRasterWidth(); final int sourceH = product.getSceneRasterHeight(); final Rectangle2D rect = XRectangle2D.createFromExtremums(0.5, 0.5, sourceW - 0.5, sourceH - 0.5); int pointsPerSide = Math.max(sourceH, sourceW) / 10; pointsPerSide = Math.max(9, pointsPerSide); final ReferencedEnvelope sourceEnvelope = new ReferencedEnvelope(rect, sourceCrs); final ReferencedEnvelope targetEnvelope = sourceEnvelope.transform(targetCrs, true, pointsPerSide); double minX = targetEnvelope.getMinX(); double width = targetEnvelope.getWidth(); if (product.getGeoCoding().isCrossingMeridianAt180()) { minX = -180.0; width = 360; } return new Rectangle2D.Double(minX, targetEnvelope.getMinY(), width, targetEnvelope.getHeight()); } catch (Exception e) { throw new IllegalStateException(e); } }
throw new IllegalArgumentException("searchRadius < 2"); crossingMeridianAt180 = pixelPosEstimator.isCrossingMeridianAt180(); GeoPos p0 = pixelPosEstimator.getGeoPos(new PixelPos(0.5f, 0.5f), null); GeoPos p1 = pixelPosEstimator.getGeoPos(new PixelPos(1.5f, 0.5f), null);
private void assertEquality(final GeoCoding gc1, final GeoCoding gc2, float accuracy) { assertNotNull(gc2); assertEquals(gc1.canGetGeoPos(), gc2.canGetGeoPos()); assertEquals(gc1.canGetPixelPos(), gc2.canGetPixelPos()); assertEquals(gc1.isCrossingMeridianAt180(), gc2.isCrossingMeridianAt180()); if (gc1 instanceof CrsGeoCoding) { assertEquals(CrsGeoCoding.class, gc2.getClass()); CRS.equalsIgnoreMetadata(gc1, gc2); } else if (gc1 instanceof TiePointGeoCoding) { assertEquals(TiePointGeoCoding.class, gc2.getClass()); } final int width = outProduct.getSceneRasterWidth(); final int height = outProduct.getSceneRasterHeight(); GeoPos geoPos1 = null; GeoPos geoPos2 = null; final String msgPattern = "%s at [%d,%d] is not equal:"; for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { final PixelPos pixelPos = new PixelPos(i, j); geoPos1 = gc1.getGeoPos(pixelPos, geoPos1); geoPos2 = gc2.getGeoPos(pixelPos, geoPos2); assertEquals(String.format(msgPattern, "Latitude", i, j), geoPos1.lat, geoPos2.lat, accuracy); assertEquals(String.format(msgPattern, "Longitude", i, j), geoPos1.lon, geoPos2.lon, accuracy); } } }
double east = lowerRightGP.getLon(); double west = upperLeftGP.getLon(); if (geoCoding.isCrossingMeridianAt180()) { east += 360;
@Test public void testCrossing180() throws Exception { final Rectangle imageBounds = new Rectangle(10, 20); srcGeoCoding = createCrsGeoCodingCross180(imageBounds); assertTrue(srcGeoCoding.isCrossingMeridianAt180()); final Band srcNode = new Band("srcDummy", ProductData.TYPE_INT8, 10, 20); srcNode.setGeoCoding(srcGeoCoding); srcScene = SceneFactory.createScene(srcNode); final ProductSubsetDef subsetDef = new ProductSubsetDef("subset"); subsetDef.setRegion(2, 2, 8, 8); subsetDef.setSubSampling(2, 2); boolean transfered = srcScene.transferGeoCodingTo(destScene, subsetDef); assertTrue(transfered); assertTrue(destScene.getGeoCoding().isCrossingMeridianAt180()); subsetDef.setRegion(2, 2, 2, 2); transfered = srcScene.transferGeoCodingTo(destScene, subsetDef); assertTrue(transfered); assertFalse(destScene.getGeoCoding().isCrossingMeridianAt180()); }
final GeoPos lowerRightGP = geoCoding.getGeoPos(lowerRightPP, null); float eastLon = lowerRightGP.getLon(); if (geoCoding.isCrossingMeridianAt180()) { eastLon += 360;