Revision: 6618 http://sourceforge.net/p/jump-pilot/code/6618 Author: michaudm Date: 2020-11-07 16:16:37 +0000 (Sat, 07 Nov 2020) Log Message: ----------- Cleanup of RasterImageLayer and some related classes
Modified Paths: -------------- core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java core/trunk/src/org/openjump/core/rasterimage/GDALInternalMetadata.java core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java 2020-10-27 12:47:46 UTC (rev 6617) +++ core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java 2020-11-07 16:16:37 UTC (rev 6618) @@ -220,24 +220,22 @@ int l=0; for(RasterImageLayer rasterImageLayer : layerables_l) { layerNames[l] = rasterImageLayer.getName(); - try { - cellValues[l] = ""; - for(int b=0; b<rasterImageLayer.getNumBands(); b++) { - Double cellValue = rasterImageLayer.getCellValue(coord.x, coord.y, b); - if(cellValue != null) { - if(rasterImageLayer.isNoData(cellValue)) { - cellValues[l] = Double.toString(Double.NaN); - } else { - cellValues[l] = cellValues[l].concat(Double.toString(cellValue)); - } + cellValues[l] = ""; + for(int b=0; b<rasterImageLayer.getNumBands(); b++) { + Double cellValue = rasterImageLayer.getCellValue(coord.x, coord.y, b); + if(cellValue != null) { + if(rasterImageLayer.isNoData(cellValue)) { + cellValues[l] = Double.toString(Double.NaN); + } else { + cellValues[l] = cellValues[l].concat(Double.toString(cellValue)); } - cellValues[l] = cellValues[l].concat(";"); + } else { + cellValues[l] = "???"; } + cellValues[l] = cellValues[l].concat(";"); + } - } catch(RasterDataNotFoundException ex) { - cellValues[l] = "???"; - } l++; } Modified: core/trunk/src/org/openjump/core/rasterimage/GDALInternalMetadata.java =================================================================== --- core/trunk/src/org/openjump/core/rasterimage/GDALInternalMetadata.java 2020-10-27 12:47:46 UTC (rev 6617) +++ core/trunk/src/org/openjump/core/rasterimage/GDALInternalMetadata.java 2020-11-07 16:16:37 UTC (rev 6618) @@ -94,7 +94,7 @@ @Override public void characters(char[] ac, int i, int j) throws SAXException { tmpValue = new String(ac, i, j); - System.out.println(tmpValue); + //System.out.println(tmpValue); } private String tmpValue; Modified: core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java =================================================================== --- core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java 2020-10-27 12:47:46 UTC (rev 6617) +++ core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java 2020-11-07 16:16:37 UTC (rev 6618) @@ -21,7 +21,6 @@ import java.awt.image.IndexColorModel; import java.awt.image.Raster; import java.awt.image.renderable.ParameterBlock; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.UUID; @@ -80,11 +79,8 @@ protected double oldScaleXImg2Canvas; protected int xOffset, yOffset; - - //protected static PersonalLogger logger = new PersonalLogger(DebugUserIds.OLE); - + protected double transparencyLevel = .0f; - protected static long availRAM = Runtime.getRuntime().maxMemory(); protected static double freeRamFactor = 0.5; @@ -104,11 +100,10 @@ //-- [sstein 2nd Aug 2010] new, since we scale the image now for display protected Raster actualRasterData = null; protected boolean rasterDataChanged = false; //may be needed for rescaling the image values - protected boolean wasScaledForDisplay = false; + //protected boolean wasScaledForDisplay = false; // never used ! //-- end - protected BufferedImage imageProcessingStep1 = null, imageProcessingStep2 = null; - + protected BufferedImage scaledBufferedImage = null; protected Envelope actualImageEnvelope = null, visibleEnv = null, oldVisibleEnv; protected Envelope originalImageEnvelope = null; @@ -120,13 +115,12 @@ protected boolean firingAppearanceEvents = true; /** - * Flag to control if the image should be deleted from RAM as soon as possible to save RAM or if it should be keeped e.g. because it was generated + * Flag to control if the image should be deleted from RAM as soon as possible to save RAM + * or if it should be keeped e.g. because it was generated * dynamically and can not be loaded from a file again, once it was deleted. */ protected boolean needToKeepImage = false; - - protected static final Point nullpunkt = new Point(0,0); - + protected Color transparentColor = null; protected boolean transparencyColorNeedsToBeApplied = false; @@ -149,9 +143,7 @@ */ public RasterImageLayer() { super(); - getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, true); - } /** @@ -184,13 +176,14 @@ } /** - *@param name name of the layer - *@param layerManager - * @param imageFileName - *@param imageToDisplay the image (if already loaded) or null - * @param wholeImageEnvelope + * @param name name of the layer + * @param layerManager the LayerManager + * @param imageFileName the name of the image file + * @param imageToDisplay the image (if already loaded) or null + * @param wholeImageEnvelope the image envelope in model (real world) coordinates */ - public RasterImageLayer(String name, LayerManager layerManager, String imageFileName, BufferedImage imageToDisplay, Envelope wholeImageEnvelope) { + public RasterImageLayer(String name, LayerManager layerManager, String imageFileName, + BufferedImage imageToDisplay, Envelope wholeImageEnvelope) { super(name, layerManager); getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, true); @@ -219,13 +212,18 @@ * no file name, but an image * *@param name name of the layer - *@param layerManager + *@param layerManager the LayerManager *@param imageToDisplay the image (if already loaded) or null *@param newRaster the raster (if already loaded) or null - *@param envelope real-world coordinates of the image + *@param wholeImageEnvelope the image envelope in model (real world) coordinates */ public RasterImageLayer(String name, LayerManager layerManager, BufferedImage imageToDisplay, Raster newRaster, Envelope wholeImageEnvelope) { super(name, layerManager); + + if (imageToDisplay == null || newRaster == null) { + Logger.warn("imageToDisplay and newRaster must not be null"); + return; + } getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, true); @@ -232,16 +230,8 @@ this.setNeedToKeepImage(true); this.originalImageEnvelope = wholeImageEnvelope; - if (imageToDisplay != null) - this.setImage(imageToDisplay); - else{ - //logger.printError("given image is NULL"); - } - if (newRaster != null) { -// this.setRasterData(newRaster); - }else{ - //logger.printError("given raster is NULL"); - } + this.setImage(imageToDisplay); + //[sstein 9.Aug.2010] long avram = getAvailRAM(); if(avram > 256000000){ @@ -265,12 +255,9 @@ public Object clone() throws CloneNotSupportedException { RasterImageLayer raster = null; try { - raster = new RasterImageLayer(getName(), getLayerManager(), getImageFileName(), getImageForDisplay(), new Envelope(getWholeImageEnvelope())); + raster = new RasterImageLayer(getName(), getLayerManager(), getImageFileName(), + getImageForDisplay(), new Envelope(getWholeImageEnvelope())); raster.needToKeepImage = needToKeepImage; - } catch (IOException ex) { - Logger.error(ex); - } catch (NoninvertibleTransformException ex) { - Logger.error(ex); } catch (Exception ex) { Logger.error(ex); } @@ -284,8 +271,7 @@ } /** - * apply a scale operation to the image and return the - * new image. + * apply a scale operation to the image and return the new image. */ protected BufferedImage scaleImage(BufferedImage im, float xScale, float yScale) { ParameterBlock pb = new ParameterBlock(); @@ -295,40 +281,27 @@ return JAI.create("Scale", pb, null).getAsBufferedImage(); } - - - - protected BufferedImage createOneColorImage(double scaleXImg2Canvas, double scaleYImg2Canvas){ - //logger.printDebug("fixing 1px scale: scaleXImg2Canvas = " + scaleXImg2Canvas + ", scaleYImg2Canvas = " + scaleYImg2Canvas); - //logger.printDebug("this.imageProcessingStep1: " + this.imageProcessingStep1 .getWidth() + ", " + this.imageProcessingStep1.getHeight()); - - scaleXImg2Canvas = Math.min( Math.abs(scaleXImg2Canvas), Math.abs(visibleRect.width) ); - scaleYImg2Canvas = Math.min( Math.abs(scaleYImg2Canvas), Math.abs(visibleRect.height) ); - - //logger.printDebug("fixed 1px scale: scaleXImg2Canvas = " + scaleXImg2Canvas + ", scaleYImg2Canvas = " + scaleYImg2Canvas); - + + + /** + * Create a single color image in the case where a single image pixel is visible + * @param color color of the pixel + * @return a single color BufferedImage + */ + protected BufferedImage createOneColorImage(Color color){ BufferedImage bim = new BufferedImage(visibleRect.width, visibleRect.height, BufferedImage.TYPE_INT_ARGB); - Graphics2D grfcs = bim.createGraphics(); - - grfcs.setColor(new Color(this.imageProcessingStep1.getRGB(0,0))); - - //logger.printDebug("color: " + new Color(this.imageProcessingStep1.getAsBufferedImage().getRGB(0,0)).toString()); - + grfcs.setColor(color); grfcs.fillRect( 0, 0, bim.getWidth(), bim.getHeight() ); - grfcs.dispose(); - + bim.flush(); return bim; - - //return PlanarImage.wrapRenderedImage(bim); } - BufferedImage imageFinal = null; /** * Creates the image to draw - * @param layerViewPanel - * @return + * @param layerViewPanel the LayerViewPanel where the image will be drawn + * @return the BufferedImage to be drawn */ public BufferedImage createImage(LayerViewPanel layerViewPanel) { @@ -337,32 +310,31 @@ if (!this.isVisible() || this.transparencyLevel >= 1.0){ this.setImageProcessingMode(RasterImageLayer.MODE_NONE); this.clearImageAndRaster(true); - //logger.printDebug("!visible"); + Logger.debug("Image " + imageFileName + " is not visible"); return null; } - + BufferedImage imageToDraw = null; try { - - //GeoTIFFRaster grr = new GeoTIFFRaster((new File(imageFileName)).toURI().toString()); - + java.awt.Point imageDims = RasterImageIO.getImageDimensions(imageFileName); - + + assert imageDims != null; origImageWidth = imageDims.x; origImageHeight = imageDims.y; visibleRect = viewport.getPanel().getVisibleRect(); - + int visibleX1 = visibleRect.x; int visibleY1 = visibleRect.y; int visibleX2 = visibleX1 + visibleRect.width; int visibleY2 = visibleY1 + visibleRect.height; - - Coordinate upperLeftVisible = viewport.toModelCoordinate(nullpunkt); + + // Viewport envelope in model coordinates + Coordinate upperLeftVisible = viewport.toModelCoordinate(new Point(visibleX1, visibleY1)); Coordinate lowerRightVisible = viewport.toModelCoordinate(new Point(visibleX2, visibleY2)); - - Envelope newVisibleEnv = new Envelope(upperLeftVisible.x, lowerRightVisible.x, upperLeftVisible.y, lowerRightVisible.y); - + Envelope newVisibleEnv = new Envelope(upperLeftVisible, lowerRightVisible); + setImageSet(false); if (visibleEnv == null || visibleEnv.getMinX() != newVisibleEnv.getMinX() || visibleEnv.getMaxX() != newVisibleEnv.getMaxX() || @@ -375,7 +347,8 @@ if(image == null) { return null; } - + + // Coordinates of actual image in viewport coordinates Point2D upperLeftCornerOfImage = viewport.toViewPoint(new Coordinate(getActualImageEnvelope().getMinX(), getActualImageEnvelope().getMaxY())); Point2D lowerRightCornerOfImage = viewport.toViewPoint(new Coordinate(getActualImageEnvelope().getMaxX(), getActualImageEnvelope().getMinY())); @@ -385,50 +358,37 @@ long totalMem = Runtime.getRuntime().totalMemory(); long freeMem = Runtime.getRuntime().freeMemory(); long committedMemory = totalMem - freeMem; - double maxMemoryToCommit = availRAM - minRamToKeepFree; - boolean needFreeRAM = (committedMemory > maxMemoryToCommit); - if(needFreeRAM == false){ - setImage(stretchImageValuesForDisplay()); - //Reverted to previous code as now rLayers are loaded using - // ImageIO which solved image display - //described on bug 498 - //DEM - /*if (stats.getBandCount()<3) { - setImage(stretchImageValuesForDisplay()); - } else {//Other images - try { - setImage(stretchImageValuesForDisplay());} - catch (ArrayIndexOutOfBoundsException e){ - setImage(getImageForDisplay()); - } - }*/ - - - // setImage(stretchImageValuesForDisplay()); - wasScaledForDisplay = true; + // There is freeRam available to cache the new image + //if(!needFreeRAM){ + setImage(stretchImageValuesForDisplay()); + + //wasScaledForDisplay = true; + if(committedMemory + minRamToKeepFree < availRAM){ setNeedToKeepImage(true); //so small images are not reloaded every time } //[sstein end] - imagePart = getVisibleImageCoordinatesOfImage( image.getWidth(), image.getHeight(), visibleEnv, getActualImageEnvelope() ); + imagePart = getVisibleImageCoordinatesOfImage(image.getWidth(), image.getHeight(), + visibleEnv, getActualImageEnvelope()); double scaleXImg2Canvas = scaledWidth / image.getWidth(); double scaleYImg2Canvas = scaledHeight / image.getHeight(); - if (imageProcessingStep2 == null || scaleXImg2Canvas != oldScaleXImg2Canvas || + if (scaledBufferedImage == null || scaleXImg2Canvas != oldScaleXImg2Canvas || !RasterImageLayer.tilesAreNotNullAndCongruent( visibleEnv, oldVisibleEnv)){ - imageProcessingStep1 = getVisiblePartOfTheImage( getImageForDisplay(), imagePart ); + scaledBufferedImage = getVisiblePartOfTheImage( getImageForDisplay(), imagePart ); - if ( imageProcessingStep1 != null) { + if (scaledBufferedImage != null) { // avoid an 1 pixel by 1 pixel image to get scaled to thousands by thousands pixels causing an out of memory error if (imagePart.width == 1 || imagePart.height == 1){ xOffset = 0; yOffset = 0; - imageProcessingStep2 = createOneColorImage(scaleXImg2Canvas, scaleYImg2Canvas); + scaledBufferedImage = createOneColorImage( + new Color(scaledBufferedImage.getRGB(0,0))); } else { - imageProcessingStep2 = getScaledImageMatchingVisible( imageProcessingStep1, scaleXImg2Canvas, scaleYImg2Canvas ); + scaledBufferedImage = getScaledImageMatchingVisible(scaledBufferedImage, scaleXImg2Canvas, scaleYImg2Canvas ); } } else { @@ -437,7 +397,7 @@ if (transparentColor!=null) transparencyColorNeedsToBeApplied = true; - imageProcessingStep1 = null; + //imageProcessingStep1 = null; xOffset = (int)(xOffset *scaleXImg2Canvas); yOffset = (int)(yOffset *(-scaleYImg2Canvas)); @@ -450,10 +410,12 @@ } - if (imageProcessingStep2 != null && transparencyColorNeedsToBeApplied ){ - imageToDraw = setupTransparency(imageProcessingStep2); - } else if (imageProcessingStep2 != null) { - imageToDraw = imageProcessingStep2; + if (scaledBufferedImage != null && transparencyColorNeedsToBeApplied ){ + scaledBufferedImage.flush(); + imageToDraw = setupTransparency(scaledBufferedImage); + } else if (scaledBufferedImage != null) { + scaledBufferedImage.flush(); + imageToDraw = scaledBufferedImage; } @@ -465,16 +427,17 @@ if (Runtime.getRuntime().freeMemory() < RasterImageLayer.getMinRamToKeepFree()){ clearImageAndRaster(true); } - + //BufferedImage imageFinal = null; if (imageToDraw != null) { - imageFinal = imageToDraw; - return imageFinal; - } else if (imageProcessingStep2!=null) { - imageFinal = imageProcessingStep2; - return imageFinal; + //imageFinal = imageToDraw; + imageToDraw.flush(); + return imageToDraw; + } else if (scaledBufferedImage!=null) { + //imageFinal = imageProcessingStep2; + scaledBufferedImage.flush(); + return scaledBufferedImage; } - return null; } @@ -489,11 +452,12 @@ // Hence we should work with committed memory as I did above??? boolean reallyNeedToFreeRAM = (Runtime.getRuntime().freeMemory() < minRamToKeepFree); if (!needToKeepImage && reallyNeedToFreeRAM ){ + flushImages(garbageCollect); //this.image = null; //rasterData = null; //[sstein 2Aug2010] line added - wasScaledForDisplay = false; //[sstein 20Aug2010] line added + //wasScaledForDisplay = false; //[sstein 20Aug2010] line added } - if (garbageCollect){ + else if (garbageCollect){ Runtime.getRuntime().gc(); } return reallyNeedToFreeRAM; @@ -507,14 +471,10 @@ if (image!=null) image.flush(); image = null; - - if (imageProcessingStep1!=null) - imageProcessingStep1.flush(); - imageProcessingStep1 = null; - - if (imageProcessingStep2!=null) - imageProcessingStep2.flush(); - imageProcessingStep2 = null; + + if (scaledBufferedImage!=null) + scaledBufferedImage.flush(); + scaledBufferedImage = null; if (garbageCollect){ Runtime.getRuntime().gc(); @@ -521,7 +481,7 @@ } } - public void reLoadImage() throws IOException, NoninvertibleTransformException, FileNotFoundException, TiffTags.TiffReadingException, Exception{ + public void reLoadImage() throws Exception { //if (image == null && !needToKeepImage){ @@ -553,7 +513,7 @@ if(image != null) { setImage(image); } - wasScaledForDisplay = false; + //wasScaledForDisplay = false; if(image != null) { actualRasterData = image.copyData(null); @@ -566,9 +526,7 @@ * use this to assign the raster data again * the method is called from getRasterData(); */ - public void reLoadImageButKeepImageForDisplay() throws IOException, - NoninvertibleTransformException, FileNotFoundException, TiffTags.TiffReadingException, Exception{ - WorkbenchContext context = getWorkbenchContext(); + public void reLoadImageButKeepImageForDisplay() throws Exception { BufferedImage pi = getImageForDisplay(); //[sstein 24.Sept.2010] commented out: //PlanarImage dontNeedThisImage = RasterImageLayer.loadImage( context, imageFileName); //causes error for .clone() @@ -638,12 +596,10 @@ // Symbology exists double value = actualRasterData.getSampleDouble(col, row, 0); - /** - * If symbology min value is higher than raster min value - * the value becomes equal to the symbology min value - */ - - Double[] symbologyClassLimits = symbology.getColorMapEntries_tm().keySet().toArray(new Double[symbology.getColorMapEntries_tm().keySet().size()]); + + // If symbology min value is higher than raster min value + // the value becomes equal to the symbology min value + Double[] symbologyClassLimits = symbology.getColorMapEntries_tm().keySet().toArray(new Double[0]); double symbMinValue = symbologyClassLimits[0]; double symbFirstValue = symbologyClassLimits[0]; if(this.isNoData(symbFirstValue)) { @@ -675,7 +631,6 @@ } } } - return newImage; } @@ -764,8 +719,9 @@ /** * Method to change the coordinates of the image and later apply the - * changes to the RasterImageLayer by using {@link RasterImageLayer#setGeometryAsEnvelope(Geometry)}. - *@return return the imageEnvelope (= bounding box) as a geometry, + * changes to the RasterImageLayer by using + * {@link RasterImageLayer#setGeometryAsWholeImageEnvelope(Geometry)}. + * @return return the imageEnvelope (= bounding box) as a geometry, */ public Polygon getWholeImageEnvelopeAsGeometry(){ Coordinate[] coordinates = new Coordinate[5]; @@ -796,7 +752,8 @@ } /** - * Method to set the coordinates of the image, e.g. after changing them after using {@link RasterImageLayer#getEnvelopeAsGeometry()}. + * Method to set the coordinates of the image, e.g. after changing them after using + * {@link RasterImageLayer#getWholeImageEnvelopeAsGeometry()}. */ public void setGeometryAsWholeImageEnvelope(Geometry geometry){ setWholeImageEnvelope(geometry.getEnvelopeInternal()); @@ -808,7 +765,7 @@ /** * Add transparency to the image (more exactly: to each pixel which a color == this.transparentColor) - *@param pImage the image + *@param bim the image */ private BufferedImage setupTransparency(BufferedImage bim){ //BufferedImage bim = pImage.getAsBufferedImage(); @@ -822,21 +779,18 @@ int transparentColor = this.getTransparentColor().getRGB(); - int currentColor = -1; int[] argb = new int[4]; if (!cm.hasAlpha()){ bim = RasterImageLayer.makeBufferedImage(bim); - cm = bim.getColorModel(); + //cm = bim.getColorModel(); } for( int w=0; w<bim.getWidth(); w++){ for (int h=0; h<bim.getHeight(); h++){ - - currentColor = bim.getRGB(w,h); - - if (currentColor==transparentColor){ + + if (bim.getRGB(w,h)==transparentColor){ Color color = new Color(bim.getRGB(w, h)); argb[0] = fullTransparencyAlpha; @@ -854,14 +808,11 @@ private void setImageProcessingMode( int nr ){ if (lastImgProcessingMode != nr){ - if (imageProcessingStep1!=null) - imageProcessingStep1.flush(); - imageProcessingStep1 = null; - - if (imageProcessingStep2!=null) - imageProcessingStep2.flush(); - imageProcessingStep2 = null; + if (scaledBufferedImage!=null) + scaledBufferedImage.flush(); + scaledBufferedImage = null; + imagePart = null; oldScaleXImg2Canvas = -1; @@ -887,16 +838,17 @@ /** * creates a BufferedImage out of an Image - *@param im the Image - *@return the BufferedImage + * @param im the Image + * @return the BufferedImage */ - public static final BufferedImage makeBufferedImage(Image im) { + public static BufferedImage makeBufferedImage(Image im) { BufferedImage copy = new BufferedImage(im.getWidth(null), im.getHeight(null), BufferedImage.TYPE_INT_ARGB); // create a graphics context Graphics2D g2d = copy.createGraphics(); // copy image g2d.drawImage(im,0,0,null); - g2d.dispose(); + g2d.dispose(); + //copy.flush(); return copy; } @@ -913,7 +865,7 @@ } - public BufferedImage getTileAsImage( Envelope wantedEnvelope ) throws IOException, NoninvertibleTransformException, FileNotFoundException, TiffTags.TiffReadingException, Exception{ + public BufferedImage getTileAsImage( Envelope wantedEnvelope ) throws Exception{ double imgWidth = image.getWidth(); double imgHeight = image.getHeight(); Envelope imageEnv = getActualImageEnvelope(); @@ -990,8 +942,9 @@ graf.drawImage(imgTile, xTileOffset, yTileOffset, imgTile.getWidth(), imgTile.getHeight(), backgroundColor, null); graf.dispose(); - this.clearImageAndRaster(false); - + //this.clearImageAndRaster(false); + imgTile.flush(); + result.flush(); return result; } @@ -1098,14 +1051,13 @@ Rectangle visible = viewport.getPanel().getVisibleRect(); - Point2D upperLeftCorner = null; - Point2D lowerRightCorner = null; + Point2D upperLeftCorner; + Point2D lowerRightCorner; try { upperLeftCorner = viewport.toViewPoint(new Coordinate(imageEnv.getMinX(), imageEnv.getMaxY())); lowerRightCorner = viewport.toViewPoint(new Coordinate(imageEnv.getMaxX(), imageEnv.getMinY())); } catch(java.awt.geom.NoninvertibleTransformException ne) { - //logger.printError(ne.getLocalizedMessage()); ne.printStackTrace(); return null; } @@ -1115,7 +1067,7 @@ int visibleX2 = visibleX1 + visible.width; int visibleY2 = visibleY1 + visible.height; - Coordinate upperLeftVisible = viewport.toModelCoordinate(nullpunkt); + Coordinate upperLeftVisible = viewport.toModelCoordinate(new Point(visibleX1, visibleY1)); Coordinate lowerRightVisible = viewport.toModelCoordinate(new Point(visibleX2, visibleY2)); Envelope newVisibleEnv = new Envelope(upperLeftVisible.x, lowerRightVisible.x, upperLeftVisible.y, lowerRightVisible.y); @@ -1136,18 +1088,26 @@ return rect; } - - protected Rectangle getVisibleImageCoordinatesOfImage( double imgWidth, double imgHeight, Envelope visible, Envelope imageEnv ){ - - double minVisibleX = Math.max(visible.getMinX(), imageEnv.getMinX()); - double minVisibleY = Math.max(visible.getMinY(), imageEnv.getMinY()); - - double maxVisibleX = Math.min(visible.getMaxX(), imageEnv.getMaxX()); - double maxVisibleY = Math.min(visible.getMaxY(), imageEnv.getMaxY()); - - double offset2VisibleX = imageEnv.getMinX() - visible.getMinX(); - double offset2VisibleY = visible.getMaxY() - imageEnv.getMaxY(); - + + /** + * Returns the visible part of the image in image coordinate + * @param imgWidth original image width + * @param imgHeight original image height + * @param viewportEnv viewport in model coordinates + * @param imageEnv image envelope in model coordinates + * @return visible part of the image in image coordinates + */ + protected Rectangle getVisibleImageCoordinatesOfImage(double imgWidth, double imgHeight, + Envelope viewportEnv, Envelope imageEnv ){ + + Envelope visiblePartOfImage = viewportEnv.intersection(imageEnv); + if (visiblePartOfImage.isNull()) return null; + + // Offset from upperleft corner of viewport to upperleft corner of image in model coordinates + double offset2VisibleX = imageEnv.getMinX() - viewportEnv.getMinX(); + double offset2VisibleY = viewportEnv.getMaxY() - imageEnv.getMaxY(); + + // Scale to convert from model coordinates to image coordinates double scaleX = imgWidth / imageEnv.getWidth(); double scaleY = imgHeight / imageEnv.getHeight(); @@ -1163,19 +1123,12 @@ yOffset = (int)(-offset2VisibleY * scaleY); } - int width = (int)((maxVisibleX-minVisibleX) * scaleX); - int height = (int)((maxVisibleY-minVisibleY) * scaleY); - - if (width < imgWidth && height < imgHeight){ - width += 1; - height += 1; - } - - - if (width <= 0 || height <= 0){ - return null; - } - + int width = (int)(visiblePartOfImage.getWidth() * scaleX); + int height = (int)(visiblePartOfImage.getHeight() * scaleY); + + if (width < imgWidth) width += 1; + if (height < imgHeight) height += 1; + return new Rectangle(xOffset, yOffset, width, height); } @@ -1200,12 +1153,8 @@ pb.add((float) desiredImageArea.height); return JAI.create("crop", pb).getAsBufferedImage(); - } - - //return PlanarImage.wrapRenderedImage( img.getAsBufferedImage( new Rectangle(desiredImageArea.x, desiredImageArea.y, desiredImageArea.width, desiredImageArea.height), img.getColorModel() )); - //logger.printWarning("desired area invalid: " + (desiredImageArea.width + desiredImageArea.x) + ", " + (desiredImageArea.height + desiredImageArea.y) + "; image dimensions: " + img.getWidth() + ", " + img.getHeight()); - } + } return null; } @@ -1224,9 +1173,7 @@ //origImageHeight = image.getHeight(); imageSet = true; } - - - + public void setImageSet(boolean imageSet) { this.imageSet = imageSet; } @@ -1237,9 +1184,9 @@ /** * returns the image, this can be modified - i.e. is just a representation. - *@return the image + * @return the image */ - public BufferedImage getImageForDisplay() throws IOException, NoninvertibleTransformException, FileNotFoundException, TiffTags.TiffReadingException, Exception{ + public BufferedImage getImageForDisplay() throws Exception { if (image == null) reLoadImage(); return image; @@ -1246,7 +1193,7 @@ } /** - *@return true, if the image object was set at least once, else false + * @return true, if the image object was set at least once, else false */ public boolean isImageSet() { return imageSet; @@ -1256,7 +1203,7 @@ * Returns the transparency level of the image. The transparencyLevel controlls the transparency level of the whole image (all pixels). It * is independent of the transparency color, that replaces a certain color in the image. * The transparencyLevel is expressed as a float within a range from 0.0 (no transparency) to 1.0 (full transparency). - *@return the transparency level of the image + * @return the transparency level of the image */ public double getTransparencyLevel() { return transparencyLevel; @@ -1451,7 +1398,7 @@ /** * for java2xml - *@param origImageHeight + *@param origImageHeight height of original image */ public void setOrigImageHeight(int origImageHeight) { this.origImageHeight = origImageHeight; @@ -1459,7 +1406,7 @@ /** * for java2xml - *@param origImageWidth + * @param origImageWidth width of original image */ public void setOrigImageWidth(int origImageWidth) { this.origImageWidth = origImageWidth; @@ -1467,7 +1414,7 @@ /** * shows or hides the image in the Jump map - *@param visible + *@param visible set true if image must be visible */ @Override public void setVisible(boolean visible) { @@ -1512,13 +1459,11 @@ } public Raster getRasterData(Rectangle subset) throws IOException { - - Raster raster = RasterImageIO.loadRasterData(imageFileName, subset); - return raster; - + + return RasterImageIO.loadRasterData(imageFileName, subset); } - public Rectangle getRectangleFromEnvelope(Envelope envelope) throws IOException { + public Rectangle getRectangleFromEnvelope(Envelope envelope) { double imgWidth = origImageWidth; double imgHeight = origImageHeight; @@ -1565,9 +1510,7 @@ int wantedWidth = (int)(envelope.getWidth() * scaleX); int wantedHeight = (int)(envelope.getHeight() * scaleY); - Rectangle subset = new Rectangle(xOffset, yOffset, wantedWidth, wantedHeight); - return subset; - + return new Rectangle(xOffset, yOffset, wantedWidth, wantedHeight); } // /** @@ -1605,7 +1548,7 @@ /** * TODO: sstein test - 25.Sept.2013 - * @return + * @return number of bands */ public int getNumBands(){ return numBands; @@ -1612,17 +1555,16 @@ } public void dispose() { - // TODO: probably a good idea to remove resources when the layer is closed up - // dunno what is needed to clean up Sextante though, hence leave it for now + // TODO: probably a good idea to remove resources when the layer is closed up + // dunno what is needed to clean up Sextante though, hence leave it for now } - public Double getCellValue(Coordinate coordinate, int band) throws RasterDataNotFoundException, IOException { + public Double getCellValue(Coordinate coordinate, int band) throws IOException { return getCellValue(coordinate.x, coordinate.y, band); - } - public Double getCellValue(int col, int row, int band) throws RasterDataNotFoundException, IOException { + public Double getCellValue(int col, int row, int band) throws IOException { int pos = row * origImageWidth + col; if(pos <0 || pos > origImageWidth * origImageHeight) return null; @@ -1631,7 +1573,7 @@ } - public Double getCellValue(double coordX, double coordY, int band) throws RasterDataNotFoundException, IOException { + public Double getCellValue(double coordX, double coordY, int band) throws IOException { double cellSizeX = (originalImageEnvelope.getMaxX() - originalImageEnvelope.getMinX()) / origImageWidth; double cellSizeY = (originalImageEnvelope.getMaxY() - originalImageEnvelope.getMinY()) / origImageHeight; @@ -1641,13 +1583,13 @@ if(col <0 || col >= origImageWidth || row <0 || row >= origImageHeight) return null; - int pos = row * origImageWidth + col; - double value; - int bands = stats.getBandCount(); - value = RasterImageIO.readCellValue(imageFileName, col, row, band); - - - /* if (stats.getBandCount()<3) { + //int pos = row * origImageWidth + col; + //double value; + //int bands = stats.getBandCount(); + return RasterImageIO.readCellValue(imageFileName, col, row, band); + + /* + if (stats.getBandCount()<3) { value = RasterImageIO.readCellValue(imageFileName, col, row, band); } else { try { @@ -1657,11 +1599,9 @@ } catch (ArrayIndexOutOfBoundsException e) { value = RasterImageIO.readCellValue(imageFileName, col, row, band); } - }*/ - return value; - // return RasterImageIO.readCellValue(imageFileName, col, row, band); - - } + } + */ + } public boolean isNoData(double value) { if(Double.isInfinite(noDataValue) && Double.isInfinite(value)) { @@ -1677,19 +1617,15 @@ return metadata; } - public class RasterDataNotFoundException extends Exception { + public static class RasterDataNotFoundException extends Exception {} - } - public static Rectangle getViewportRectangle(WorkbenchContext workbenchContext) { - Rectangle viewportRectangle = new Rectangle( + return new Rectangle( 0, 0, workbenchContext.getLayerViewPanel().getVisibleRect().width, workbenchContext.getLayerViewPanel().getVisibleRect().height); - return viewportRectangle; - } public RasterSymbology getSymbology() { @@ -1699,13 +1635,6 @@ public void setSymbology(RasterSymbology symbology) throws NoninvertibleTransformException { this.symbology = symbology; symbologyChanged = true; -// setImage(stretchImageValuesForDisplay()); - -// forceTotalRepaint(); -// if (isFiringAppearanceEvents()) { -// fireAppearanceChanged(); -// } - imageProcessingStep2 = null; LayerViewPanel layerViewPanel = getWorkbenchContext().getLayerViewPanel(); if(layerViewPanel != null) { layerViewPanel.getViewport().update(); @@ -1732,24 +1661,20 @@ * as "Temporary layers" */ public boolean isTemporaryLayer() { - if (imageFileName.contains(System.getProperty("java.io.tmpdir"))) { - return true; - } else{ - return false; - } - } - + return imageFileName.contains(System.getProperty("java.io.tmpdir")); + } - private final static String NODATASOURCELAYER= I18N + private final static String NODATASOURCELAYER = I18N .get("org.openjump.core.ui.plugin.layer.LayerPropertiesPlugIn.nodatasourcelayer.message"); + /** - *@return the file path of a RasterImageLayer.class - *eg. C/File/imagename.tif. If the file path is a TEMP folder + * @return the file path of a RasterImageLayer.class + * eg. C/File/imagename.tif. If the file path is a TEMP folder * it returns that the layer has no datasource */ public String getFilePath() { - String fileName = null; + String fileName; if (!imageFileName.contains(System.getProperty("java.io.tmpdir"))) { fileName = getImageFileName(); } else{ @@ -1756,7 +1681,7 @@ fileName = NODATASOURCELAYER; } return fileName; - } + } //[Giuseppe Aruta 04/01/2017] SRS info for RasterImageLayer.class private SRSInfo srsInfo; Modified: core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java =================================================================== --- core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java 2020-10-27 12:47:46 UTC (rev 6617) +++ core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java 2020-11-07 16:16:37 UTC (rev 6618) @@ -138,11 +138,11 @@ .toArray(new RasterImageLayer[] {}); //.toArray(new Layerable[] {}); if (ls != null && ls.length > 0) { - rLayer = (RasterImageLayer) ls[0]; + rLayer = ls[0]; name = rLayer.getName(); Coordinate coord = (Coordinate) getCoordinates().get(0); - String cellValues = null; + String cellValues; if (getPoint().within(rLayer.getWholeImageEnvelopeAsGeometry())) { try { cellValues = ""; @@ -157,6 +157,8 @@ cellValues = cellValues.concat(Double .toString(cellValue)); } + } else { + cellValues = cellValues.concat("???"); } cellValues = cellValues.concat(" "); if (Double.isNaN(cellValue)) @@ -165,8 +167,9 @@ this.lastClick = cellValues; } } - } catch (RasterDataNotFoundException ex) { - cellValues = "???"; + } catch (IOException ex) { + cellValues = " - "; + Logger.error(ex); } Geometry measureGeometry = null; if (wasShiftPressed()) { @@ -311,7 +314,7 @@ Layerable layer = (Layerable)layerable; if (layer instanceof RasterImageLayer) { - String cellValues = null; + String cellValues; try { cellValues = ""; Coordinate tentativeCoordinate = getPanel().getViewport() @@ -330,12 +333,12 @@ cellValues = cellValues.concat(Double .toString(cellValue)); } + } else { + cellValues = cellValues.concat("???"); } cellValues = cellValues.concat(" "); } - } catch (RasterDataNotFoundException ex) { - cellValues = "???"; } catch (IOException e) { cellValues = " - "; Logger.error(e); _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel