diff --git a/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoImageFactory.java b/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoImageFactory.java index c19222faa..bfcc4d103 100644 --- a/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoImageFactory.java +++ b/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoImageFactory.java @@ -210,6 +210,8 @@ public int getPriority() { } // return a priority for the given loader object + // TODO maybe we should use the following way to sort ImageReader + // https://stackoverflow.com/questions/38190507/how-to-exclude-specific-tiff-reader-from-imageio/38198991#38198991 public static int getPriority(Object loader) { String name = loader.getClass().getName(); @@ -226,8 +228,10 @@ public static int getPriority(Object loader) { return 20; } // prefer oss jai core implementation, currently only TIF + // priority 30 -> 50 : this library is no more update while + // geosolutions library is actively maintained (ex. bigtiff) else if (name.startsWith("com.github.jaiimageio")){ - return 30; + return 50; } // next are imageio-ext readers else if (name.startsWith("it.geosolutions.imageio")){ diff --git a/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoRaster.java b/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoRaster.java index c54731012..6f54a1540 100644 --- a/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoRaster.java +++ b/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoRaster.java @@ -31,6 +31,7 @@ * (250)385-6040 * www.vividsolutions.com */ +import com.vividsolutions.jump.workbench.model.Prioritized; import it.geosolutions.imageio.gdalframework.GDALImageReaderSpi; import it.geosolutions.imageio.gdalframework.GDALUtilities; import it.geosolutions.imageio.utilities.ImageIOUtilities; @@ -79,12 +80,11 @@ import com.vividsolutions.jump.workbench.Logger; import com.vividsolutions.jump.workbench.imagery.ReferencedImageException; import com.vividsolutions.jump.workbench.model.Disposable; -import com.vividsolutions.jump.workbench.model.Prioritized; public class GeoRaster implements Disposable { protected String imageFileLocation; private URI uri = null; - protected Object fixed_reader = null; + protected Object fixed_reader; protected RenderedOp src = null; private ImageReader src_reader = null; private Object src_input = null; @@ -154,7 +154,7 @@ protected void fetchRaster() throws ReferencedImageException { File file = new File(imageFileLocation); uri = file.toURI(); } - Logger.trace("uri is now -> "+uri.toString()); + Logger.trace("uri is now -> " + uri); // check availability early if (!new File(uri).canRead()) throw new ReferencedImageException("cannot read file -> "+imageFileLocation); @@ -166,13 +166,20 @@ protected void fetchRaster() throws ReferencedImageException { pbjImageRead.setParameter("readParam", param); // route, if fixed_reader was set - List affirmed_readers; + List affirmed_readers; + fixed_reader = null; // default case, auto detection if (fixed_reader == null) { - affirmed_readers = new ArrayList(listValidImageIOReaders(uri, null)); + affirmed_readers = new ArrayList<>(listValidImageIOReaders(uri, null)); + //try { + // affirmed_readers = listValidReaders(uri); + //} catch(IOException e) { + // throw new ReferencedImageException(e); + //} + //affirmed_readers.sort(Comparator.comparingInt(it -> GeoImageFactory.getPriority(it))); // sort readers by priority - Collections.sort(affirmed_readers, new Comparator() { - public int compare(final ImageReaderSpi o1, final ImageReaderSpi o2) { + Collections.sort(affirmed_readers, new Comparator() { + public int compare(final Object o1, final Object o2) { final Prioritized p1 = new Prioritized() { public int getPriority() { return GeoImageFactory.getPriority(o1); @@ -183,14 +190,16 @@ public int getPriority() { return GeoImageFactory.getPriority(o2); } }; -// System.out.println(o1+"="+p1.getPriority()+"/"+o2+"="+p2.getPriority()); return Prioritized.COMPARATOR.compare(p1, p2); } }); + Logger.info("Available sorted readers : " + affirmed_readers); } // fixed reader is imageio reader - else if (fixed_reader instanceof ImageReaderSpi) + else if (fixed_reader instanceof ImageReaderSpi) { affirmed_readers = Collections.singletonList((ImageReaderSpi) fixed_reader); + Logger.info("Fixed reader : " + affirmed_readers); + } else { // fixed reader is something else, hopefully jai codec ;) // simply define an empty imageio reader list here to skip to jai below @@ -198,43 +207,43 @@ else if (fixed_reader instanceof ImageReaderSpi) } // this is skipped if list is empty - // TODO: not sure looping makes sense here as image is - // actually rendered much later - for (Iterator i = affirmed_readers.listIterator(); i - .hasNext();) { - - ImageReaderSpi readerSpi = ((ImageReaderSpi) i.next()); - - Logger.trace("Trying reader "+GeoImageFactory.loaderString(readerSpi)); - - try { - src_input = createInput(uri, readerSpi); - - src_reader = readerSpi.createReaderInstance(/* src_input */); - src_reader.setInput(src_input); - pbjImageRead.setParameter("Input", src_input); - pbjImageRead.setParameter("Reader", src_reader); - - src = JAI.create("ImageRead", pbjImageRead, null); - - // success OR dispose & try plain JAI below - if (src != null && src.getWidth() > 0) { - // set info vars - type = src_reader.getFormatName(); - used_loader = src_reader; - return; - } - else + Logger.info("Available readers : " + affirmed_readers); + for (Object reader : affirmed_readers) { + + Logger.info("Trying reader " + GeoImageFactory.loaderString(reader)); + + if (reader instanceof ImageReaderSpi) { + ImageReaderSpi readerSpi = (ImageReaderSpi) reader; + try { + src_input = createInput(uri, reader); + + src_reader = readerSpi.createReaderInstance(/* src_input */); + + src_reader.setInput(src_input); + pbjImageRead.setParameter("Input", src_input); + pbjImageRead.setParameter("Reader", src_reader); + + src = JAI.create("ImageRead", pbjImageRead, null); + + // success OR dispose & try plain JAI below + if (src != null /*&& src.getWidth() > 0*/) { + // set info vars + type = src_reader.getFormatName(); + used_loader = src_reader; + return; + } else { + dispose(); + } + } catch (Exception e) { + // if fixed_reader failed, it failed finally and we'll have to throw the reason + if (fixed_reader != null && fixed_reader == reader) + throw new ReferencedImageException(e); + // ok, this didn't work try the next one + Logger.debug(e); + // clean up any residue dispose(); - } catch (Exception e) { - // if fixed_reader failed, it failed finally and we'll have to throw the reason - if (fixed_reader != null && fixed_reader == readerSpi) - throw new ReferencedImageException(e); - // ok, this didn't work try the next one - Logger.trace(e); - // clean up any residue - dispose(); + } } } @@ -323,7 +332,7 @@ protected Object getLoader() { // TODO: probably better moved to GeoImage where the rendering is actually handled public RenderingHints createCacheRenderingHints() { - if (src instanceof RenderedOp && src.getWidth() > 2000 + if (src != null && src.getWidth() > 2000 && src.getHeight() > 2000 && cache_hints == null) { // use 64MB for images, default 16MB is kinda small cache = JAI.createTileCache(1024 * 1024 * 64L); @@ -344,7 +353,7 @@ protected void createJAIRenderedOP(URI uri, ImageCodec codec) Object input = createInput(uri); // create a temp stream to find all candidate codecs if codec was given String[] decs; - if (codec instanceof ImageCodec) { + if (codec != null) { SeekableStream is2 = SeekableStream.wrapInputStream( createInputStream(uri), true); decs = ImageCodec.getDecoderNames((SeekableStream) is2); @@ -456,6 +465,12 @@ static protected List listValidImageIOReaders(URI uri, resetGDALReaderSelection(); // fetch all readers + // Don't know why this one is not automatically finded + // It is useful as it does not break on some wrong TiffTags like byte array nodata + // which breaks geosolutions imageio-ext reader + IIORegistry.getDefaultInstance().registerServiceProvider( + new com.github.jaiimageio.impl.plugins.tiff.TIFFImageReaderSpi(), ImageReaderSpi.class + ); final Iterator iter = IIORegistry .getDefaultInstance().getServiceProviders(ImageReaderSpi.class, false); @@ -463,10 +478,9 @@ static protected List listValidImageIOReaders(URI uri, // iterate all readers and return only valid ones ImageReaderSpi provider; - List affirmed_readers = new Vector(); + List affirmed_readers = new Vector<>(); while (iter.hasNext()) { provider = iter.next(); - //Logger.trace("test "+GeoImageFactory.loaderString(provider)); if (filter != null && !(filter.isInstance(provider))) @@ -514,7 +528,8 @@ static protected List listValidImageIOReaders(URI uri, } /** - * create a list of ImageCodec's supposedly able to open URI + * Create a list of ImageCodec's supposedly able to open URI. + * From com.sun.media.jai.codec.ImageCodec */ static protected List listValidJAICodecs(URI uri) throws IOException { @@ -535,7 +550,7 @@ static protected List listValidJAICodecs(URI uri) * create a list of JAI ImageCodec's and ImageIO readers supposedly able to open URI */ static public List listValidReaders(URI uri) throws IOException { - List l = new ArrayList(listValidImageIOReaders(uri, null)); + List l = new ArrayList<>(listValidImageIOReaders(uri, null)); l.addAll(listValidJAICodecs(uri)); return l; } @@ -544,7 +559,7 @@ static public List listValidReaders(URI uri) throws IOException { * list all JAI ImageCodec's and ImageIO readers available in this jre */ static public List listAllReaders() { - List loaders = new ArrayList(); + List loaders = new ArrayList<>(); // add imageio readers Iterator iter = IIORegistry .getDefaultInstance().getServiceProviders(ImageReaderSpi.class, true); @@ -570,6 +585,12 @@ static protected Object createInput(URI uri) throws IOException { return createInput(uri, null); } + /** + * @param uri the URI to read + * @param loader optional ImageReaderSpi + * @return the input as an InputStream, a File or a ImageInputStream + * @throws IOException + */ static protected Object createInput(URI uri, Object loader) throws IOException { @@ -598,7 +619,7 @@ static protected Object createInput(URI uri, Object loader) // how may i serve you today? Class[] clazzes = ((ImageReaderSpi) loader).getInputTypes(); List intypes = clazzes != null ? Arrays.asList(clazzes) - : new ArrayList(); + : new ArrayList<>(); //System.out.println("GR in types: " + intypes); for (Class clazz : intypes) { // already reader compliant? off you f*** diff --git a/src/com/vividsolutions/jump/workbench/model/LayerManager.java b/src/com/vividsolutions/jump/workbench/model/LayerManager.java index 812464ebc..ace242968 100644 --- a/src/com/vividsolutions/jump/workbench/model/LayerManager.java +++ b/src/com/vividsolutions/jump/workbench/model/LayerManager.java @@ -74,7 +74,7 @@ public class LayerManager { // is lucky enough to have all its strong references released, let it // dispose of // itself immediately [Jon Aquino] - private final List> layerReferencesToDispose = new ArrayList<>(); + private final List> layerReferencesToDispose = new ArrayList<>(); private final List layerListeners = new ArrayList<>(); private final Iterator firstColors; @@ -181,7 +181,9 @@ public void addLayerable(String categoryName, Layerable layerable) { // else { // reproject((Layer) layerable, coordinateSystem); // } - layerReferencesToDispose.add(new WeakReference<>(layerable)); + if (layerable instanceof Disposable) { + layerReferencesToDispose.add(new WeakReference((Disposable)layerable)); + } } addCategory(categoryName); @@ -395,11 +397,11 @@ public void removeIfEmpty(Category category) { public void dispose() { this.setFiringEvents(false); - for (WeakReference reference : layerReferencesToDispose) { - Layer layer = (Layer) reference.get(); + for (WeakReference reference : layerReferencesToDispose) { + Disposable disposableLayer = reference.get(); - if (layer != null) { - layer.dispose(); + if (disposableLayer != null) { + disposableLayer.dispose(); } } diff --git a/src/com/vividsolutions/jump/workbench/model/LayerTreeModel.java b/src/com/vividsolutions/jump/workbench/model/LayerTreeModel.java index 0110b9bf0..b1b4ea92f 100644 --- a/src/com/vividsolutions/jump/workbench/model/LayerTreeModel.java +++ b/src/com/vividsolutions/jump/workbench/model/LayerTreeModel.java @@ -42,9 +42,7 @@ import com.vividsolutions.jump.workbench.ui.renderer.style.BasicStyle; import com.vividsolutions.jump.workbench.ui.renderer.style.ColorThemingStyle; import org.openjump.core.rasterimage.RasterColorMapSymbology; -import org.openjump.core.rasterimage.RasterHeatmapSymbology; import org.openjump.core.rasterimage.RasterImageLayer; -import org.openjump.core.rasterimage.RasterSymbology; /** * JTree model for displaying the Layers, WMSLayers, and other Layerables @@ -100,8 +98,6 @@ public static class RasterStyleValueIntv implements SymbolizationLeafNode { private final Double nextValue; private final Double value; private final String label; - //private int width; - //private int height; RasterStyleValueIntv( String colorMapType, @@ -136,14 +132,6 @@ public String getLabel() { return label; } - //public int getWidth() { - // return width; - //} - - //public int getHeight() { - // return height; - //} - @Override public String toString() { return label; @@ -170,9 +158,7 @@ public static class RasterStyleValueRamp implements SymbolizationLeafNode { private final Double topValue; private final Double bottomValue; - private final Color[] colors; - //private int width; - //private int height; + private final Color[] colors; RasterStyleValueRamp(Double topValue, Double bottomValue, Color[] colors) { this.topValue = topValue; @@ -180,22 +166,6 @@ public static class RasterStyleValueRamp implements SymbolizationLeafNode { this.colors = colors; } - //RasterStyleValueRamp(Double topValue, Double bottomValue, Color[] colors, int width, int height) { - // this.topValue = topValue; - // this.bottomValue = bottomValue; - // this.colors = colors; - // //this.width = width; - // //this.height = height; - //} - - //public int getWidth() { - // return width; - //} - - //public int getHeight() { - // return height; - //} - @Override public String toString() { return bottomValue + "-" + topValue; @@ -283,7 +253,7 @@ else if (parent instanceof RasterImageLayer) { RasterColorMapSymbology rasterSymbology = (RasterColorMapSymbology)rasterImageLayer.getSymbology(); double bottomValue = rasterImageLayer.getMetadata().getStats().getMin(0); double topValue = rasterImageLayer.getMetadata().getStats().getMax(0); - Double[] keys = rasterSymbology.getColorMapEntries_tm().keySet().toArray(new Double[0]); + Double[] keys = rasterSymbology.getColorTreeMap().keySet().toArray(new Double[0]); if(!rasterImageLayer.getSymbology().getType().equals(RasterColorMapSymbology.TYPE_RAMP)) { @@ -296,7 +266,7 @@ else if (parent instanceof RasterImageLayer) { double nextValue = (i == keys.length-1)? topValue : keys[i+1]; - Color color = rasterSymbology.getColorMapEntries_tm().get(key); + Color color = rasterSymbology.getColorTreeMap().get(key); styleValues_l.add(new RasterStyleValueIntv( rasterSymbology.getType(), @@ -318,7 +288,7 @@ else if (parent instanceof RasterImageLayer) { for(int i=keys.length-1; i>=0; i--) { Double key = keys[i]; if(!rasterImageLayer.isNoData(key)) { - Color color = rasterSymbology.getColorMapEntries_tm().get(key); + Color color = rasterSymbology.getColorTreeMap().get(key); colors_l.add(color); } } diff --git a/src/org/openjump/core/ccordsys/utils/ProjUtils.java b/src/org/openjump/core/ccordsys/utils/ProjUtils.java index 8950d53aa..1230e7079 100644 --- a/src/org/openjump/core/ccordsys/utils/ProjUtils.java +++ b/src/org/openjump/core/ccordsys/utils/ProjUtils.java @@ -3,7 +3,6 @@ import java.io.File; import java.io.IOException; import java.net.URI; -import java.net.URISyntaxException; import java.util.Iterator; import java.util.Map; import java.util.Scanner; @@ -61,11 +60,10 @@ public class ProjUtils { * . eg. "c\documents\folder\image.tif" * @return the projection srid as a string. eg "32632" * @throws IOException if an IOException occurs - * @throws URISyntaxException if an URISyntaxException occurs */ public static SRSInfo getSRSInfoFromGeoTiff(String fileSourcePath) - throws IOException, URISyntaxException, - TiffTags.TiffReadingException, ImageReadException { + throws IOException, + TiffTags.TiffReadingException, ImageReadException { return TiffTags.readMetadata(new File(fileSourcePath)).getSRSInfo(); } @@ -83,11 +81,9 @@ public static SRSInfo getSRSInfoFromGeoTiff(String fileSourcePath) * auxiliary file path * @return SRSInfo and Projection definition * @throws IOException if an IOException occurs - * @throws URISyntaxException if an URISyntaxException occurs */ - public static SRSInfo getSRSInfoFromAuxiliaryFile(String fileSourcePath) - throws URISyntaxException, IOException { + throws IOException { // --- it reads an auxiliary file and decode a possible proj // --- definition to a simple string. Ex. "WGS 84 UTM Zone 32" @@ -108,25 +104,6 @@ public static SRSInfo getSRSInfoFromAuxiliaryFile(String fileSourcePath) textProj = scanner.nextLine(); srsInfo = new SRSInfo().setSource(projectSourceFilePrj); scanner.close(); - /* - try { - // Use new crs library to parse prj file if possible - CoordinateReferenceSystem crs = new CRSFactory() - .createFromPrj(textProj); - if (crs.getAuthorityKey() != null - && !crs.getAuthorityKey().equals("0")) { - srsInfo.setRegistry(crs.getAuthorityName()); - srsInfo.setCode(crs.getAuthorityKey()); - srsInfo.setUnit(Unit.find(crs.getCoordinateSystem() - .getUnit(0).toString())); - srsInfo.setDescription(crs.getName()); - srsInfo.complete(); - return srsInfo; - } - } catch (CRSException e) { - e.printStackTrace(); - } - */ } } else if (new File(projectSourceRFilePrj).exists()) { Scanner scanner = new Scanner(new File(projectSourceRFilePrj)); @@ -188,8 +165,7 @@ private static String decodeProjDescription(String textProj) { int end = textProj.indexOf("\",", start); prjname = textProj.substring(start + 2, end); // The following set of replacements allows to "harmonize" OGC, ESRI - // and - // few other WKT projection definitions + // and few other WKT projection definitions prjname = prjname.replaceAll("_", " ").replace(" / ", " ") .replaceAll("\\bft US\\b", "(ftUS)") .replaceAll("\\bftUS\\b", "(ftUS)") @@ -331,7 +307,7 @@ public static SRSInfo getSRSInfoFromLayerSource(Layer layer) String sourcePathImage = null; for (Iterator i = featureCollection.iterator(); i.hasNext();) { - Feature feature = (Feature) i.next(); + Feature feature = i.next(); sourcePathImage = feature .getString(ImageryLayerDataset.ATTR_URI); @@ -405,27 +381,20 @@ private static boolean isTemporaryLayer(Layer layer) { // Boolean. Selected layer is related to a database private static boolean isDataBaseLayer(Layer layer) { DataSourceQuery dsq = layer.getDataSourceQuery(); - if (dsq == null - || dsq.getDataSource() instanceof DataStoreQueryDataSource) { - return true; - } else { - return false; - } + return dsq != null && dsq.getDataSource() instanceof DataStoreQueryDataSource; } // Boolean. Selected layer is related to GEoTIFF file public static boolean isImageGeoTIFFLayer(Layer layer) { - // String sclass = layer.getClass().getSimpleName(); - // if (sclass.equals("ReferencedImagesLayer")) String fileSourcePath = ""; if (layer.getStyle(ReferencedImageStyle.class) != null && (layer.getDescription() != null)) { FeatureCollection featureCollection = layer .getFeatureCollectionWrapper(); - String sourcePathImage = null; + String sourcePathImage; for (Iterator i = featureCollection.iterator(); i.hasNext();) { - Feature feature = (Feature) i.next(); + Feature feature = i.next(); sourcePathImage = feature .getString(ImageryLayerDataset.ATTR_URI); @@ -440,18 +409,13 @@ public static boolean isImageGeoTIFFLayer(Layer layer) { String extension = FileUtil.getExtension(fileSourcePath) .toUpperCase(); if ((extension.equals("TIF") || extension.equals("TIFF"))) { - TiffTags.TiffMetadata metadata = null; + TiffTags.TiffMetadata metadata; try { metadata = TiffTags.readMetadata(new File(fileSourcePath)); - } catch (ImageReadException | IOException - | TiffReadingException e) { + return metadata.isGeoTiff(); + } catch (ImageReadException | IOException | TiffReadingException e) { e.printStackTrace(); } - if (metadata.isGeoTiff()) { - return true; - } else { - return false; - } } } return false; @@ -466,14 +430,18 @@ public static boolean isImageGeoTIFFLayer(Layer layer) { // If layer is temporary or srid=0, it sets srid source to null // public static SRSInfo getSRSInfoFromLayerSource(RasterImageLayer layer) - throws Exception, URISyntaxException { + throws Exception { String fileSourcePath = layer.getImageFileName(); String extension = FileUtil.getExtension(fileSourcePath).toLowerCase(); SRSInfo srsInfo = null; // try to read geo tag + // 2022-04-18 [mmichaud] use imageio-ext instead of common-imaging + // to be able to read bigtiff if (extension.equals("tif") || extension.equals("tiff")) { try { - TiffTags.TiffMetadata metadata = TiffTags.readMetadata(new File(fileSourcePath)); + //TiffTags.TiffMetadata metadata = TiffTags.readMetadataWithImageIoExt(new File(fileSourcePath)); + TiffTags.TiffMetadata metadata = TiffTags.readIIOMetadata(new File(fileSourcePath)); + //TiffTags.TiffMetadata metadata = TiffTags.readMetadata(new File(fileSourcePath)); if (metadata.isGeoTiff()) { srsInfo = metadata.getSRSInfo(); srsInfo.setSource(EMBEDDED_SRS); diff --git a/src/org/openjump/core/rasterimage/algorithms/GenericRasterAlgorithm.java b/src/org/openjump/core/rasterimage/algorithms/GenericRasterAlgorithm.java index 747e2a22a..39f51976e 100644 --- a/src/org/openjump/core/rasterimage/algorithms/GenericRasterAlgorithm.java +++ b/src/org/openjump/core/rasterimage/algorithms/GenericRasterAlgorithm.java @@ -282,10 +282,11 @@ public void save_CropToEnvelope(File outputFile, final RasterImageIO rasterImageIO = new RasterImageIO(); rasterImageIO.writeImage(outputFile, raster, envelope, - rasterImageIO.new CellSizeXY(rasterLayer.getMetadata() - .getOriginalCellSize(), rasterLayer.getMetadata() - .getOriginalCellSize()), rasterLayer.getMetadata() - .getNoDataValue()); + rasterImageIO.new CellSizeXY( + rasterLayer.getMetadata().getOriginalCellSize().getX(), + rasterLayer.getMetadata().getOriginalCellSize().getY() + ), + rasterLayer.getMetadata().getNoDataValue()); } @@ -322,8 +323,8 @@ public void save_CropToGeometry(File outputFile, rasterImageIO.writeImage(outputFile, raster2, env, rasterImageIO.new CellSizeXY(rasterLayer.getMetadata() - .getOriginalCellSize(), rasterLayer.getMetadata() - .getOriginalCellSize()), rasterLayer.getMetadata() + .getOriginalCellSize().getX(), rasterLayer.getMetadata() + .getOriginalCellSize().getY()), rasterLayer.getMetadata() .getNoDataValue()); } @@ -351,10 +352,10 @@ public void save_WarpToEnvelope(File file, RasterImageLayer rLayer, final RenderedOp outputOp = JAI.create("Scale", pb, null); rasterImageIO.writeImage(file, outputOp.copyData(), env, - rasterImageIO.new CellSizeXY(rLayer.getMetadata() - .getOriginalCellSize(), rLayer.getMetadata() - .getOriginalCellSize()), rLayer.getMetadata() - .getNoDataValue()); + rasterImageIO.new CellSizeXY( + rLayer.getMetadata().getOriginalCellSize().getX(), + rLayer.getMetadata().getOriginalCellSize().getY()), + rLayer.getMetadata().getNoDataValue()); } diff --git a/src/org/openjump/core/rasterimage/algorithms/KernelAlgorithm.java b/src/org/openjump/core/rasterimage/algorithms/KernelAlgorithm.java index db11d08a0..1c53f16de 100644 --- a/src/org/openjump/core/rasterimage/algorithms/KernelAlgorithm.java +++ b/src/org/openjump/core/rasterimage/algorithms/KernelAlgorithm.java @@ -279,8 +279,8 @@ public void filterRaster(File file, RasterImageLayer rLayer, float[] kernel) final RasterImageIO rasterImageIO = new RasterImageIO(); rasterImageIO.writeImage(file, result.getData(), rLayer .getWholeImageEnvelope(), rasterImageIO.new CellSizeXY(rLayer - .getMetadata().getOriginalCellSize(), rLayer.getMetadata() - .getOriginalCellSize()), rLayer.getMetadata().getNoDataValue()); + .getMetadata().getOriginalCellSize().getX(), rLayer.getMetadata() + .getOriginalCellSize().getY()), rLayer.getMetadata().getNoDataValue()); } public void filterRaster2(File file, RasterImageLayer rLayer, float[] kernel) @@ -316,8 +316,8 @@ public void filterRaster2(File file, RasterImageLayer rLayer, float[] kernel) final RasterImageIO rasterImageIO = new RasterImageIO(); rasterImageIO.writeImage(file, result.getData(), rLayer .getWholeImageEnvelope(), rasterImageIO.new CellSizeXY(rLayer - .getMetadata().getOriginalCellSize(), rLayer.getMetadata() - .getOriginalCellSize()), rLayer.getMetadata().getNoDataValue()); + .getMetadata().getOriginalCellSize().getX(), rLayer.getMetadata() + .getOriginalCellSize().getY()), rLayer.getMetadata().getNoDataValue()); } //TODO how is it different from GenericRasterAlgorithm.load ? diff --git a/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java b/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java index 483d07326..b28b6dbfa 100644 --- a/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java +++ b/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java @@ -27,7 +27,6 @@ import org.openjump.core.rasterimage.IRasterSymbology; import org.openjump.core.rasterimage.RasterColorMapSymbology; import org.openjump.core.rasterimage.RasterImageLayer; -import org.openjump.core.rasterimage.RasterSymbology; import org.openjump.core.rasterimage.styler.ui.ColorsLabelLegendComponent; import org.openjump.core.rasterimage.styler.ui.GradientLabelLegendComponent; import org.openjump.core.ui.io.file.FileNameExtensionFilter; @@ -79,7 +78,6 @@ false, getIcon(), } JScrollPane scrollPane = new JScrollPane(); - WorkbenchContext wcontext = JUMPWorkbench.getInstance().getContext(); public static RasterImageLayer rasterImageLayer = new RasterImageLayer(); @@ -100,7 +98,7 @@ public boolean execute(PlugInContext context) throws Exception { RasterColorMapSymbology symbology = (RasterColorMapSymbology) rasterStyler; - if (symbology.getColorMapEntries_tm().size() > 40) { + if (symbology.getColorTreeMap().size() > 40) { JOptionPane.showMessageDialog(context.getWorkbenchFrame(), // bundle.getString("LegendDialog.More40Colors.message"), "More than 40 colors", RasterStylesExtension.extensionName, @@ -108,8 +106,7 @@ public boolean execute(PlugInContext context) throws Exception { return false; } - final TreeMap colorMapEntries = symbology - .getColorMapEntries_tm(); + final TreeMap colorMapEntries = symbology.getColorTreeMap(); final String type = RasterLegendPlugIn.getLayer().getSymbology() .getType(); @@ -222,24 +219,8 @@ public Dimension getPreferredSize() { } }; - saveButton.addActionListener(new java.awt.event.ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - save(scrollPane); - // frame.dispose(); - return; - } - }); - closeButton.addActionListener(new java.awt.event.ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - - frame.dispose(); - - return; - } - }); + saveButton.addActionListener(e -> save(scrollPane)); + closeButton.addActionListener(e -> frame.dispose()); okPanel.add(saveButton, BorderLayout.WEST); okPanel.add(closeButton, BorderLayout.EAST); return okPanel; @@ -267,7 +248,7 @@ private JPanel getPanelInterval(TreeMap colorMapEntry_tm, } private JPanel getPanelGradient(TreeMap colorMapEntry, - RasterImageLayer rLayer) throws Exception { + RasterImageLayer rLayer) { final GradientLabelLegendComponent component = new GradientLabelLegendComponent( colorMapEntry, rLayer.getNoDataValue(), rLayer.getName()); @@ -316,8 +297,7 @@ public void save(JScrollPane pane) { filter = new FileNameExtensionFilter("Portable Network Graphics (png)", "png"); - final JFileChooser fc = new GUIUtil.FileChooserWithOverwritePrompting( - "png"); + final JFileChooser fc = new GUIUtil.FileChooserWithOverwritePrompting("png"); fc.setFileFilter(filter); fc.addChoosableFileFilter(filter); diff --git a/src/org/openjump/core/rasterimage/styler/SLDHandler.java b/src/org/openjump/core/rasterimage/styler/SLDHandler.java index c19f88968..c572ced9b 100644 --- a/src/org/openjump/core/rasterimage/styler/SLDHandler.java +++ b/src/org/openjump/core/rasterimage/styler/SLDHandler.java @@ -127,7 +127,7 @@ public static void write(IRasterSymbology symbology, String symbologyName, File if (symbology instanceof RasterColorMapSymbology) { for (Map.Entry colorMapEntry : - ((RasterColorMapSymbology)symbology).getColorMapEntries_tm().entrySet()) { + ((RasterColorMapSymbology)symbology).getColorTreeMap().entrySet()) { writer.writeStartElement("ColorMapEntry"); writer.writeAttribute("Color", SLDHandler.rgb2Hex(colorMapEntry.getValue())); diff --git a/src/org/openjump/core/rasterimage/styler/ui/GradientCanvas.java b/src/org/openjump/core/rasterimage/styler/ui/GradientCanvas.java index f3c553379..6c30c70b2 100644 --- a/src/org/openjump/core/rasterimage/styler/ui/GradientCanvas.java +++ b/src/org/openjump/core/rasterimage/styler/ui/GradientCanvas.java @@ -6,7 +6,6 @@ import java.awt.Graphics2D; import java.awt.LinearGradientPaint; import java.awt.Paint; -import java.util.Arrays; import java.util.Map; import java.util.TreeMap; import javax.swing.JComponent; @@ -79,7 +78,10 @@ public void paint(Graphics g){ for (ColorMapEntry colorMapEntry : colorMapEntries) { float fraction = (float) (colorMapEntry.getUpperValue() / colorMapEntries[colorMapEntries.length - 1].getUpperValue()); - map.put(fraction, colorMapEntry.getColor()); + // Color maybe null in certain cases for nodata value (not sure if it is intended) + if (colorMapEntry.getColor() != null) { + map.put(fraction, colorMapEntry.getColor()); + } } float[] fractions = new float[map.size()]; Color[] colors = new Color[map.size()]; @@ -89,7 +91,6 @@ public void paint(Graphics g){ colors[index] = entry.getValue(); index++; } - System.out.println(Arrays.toString(fractions)); if(type == GradientType.HORIZONTAL) { if (orientation == GradientOrientation.DIRECT) { paint = new LinearGradientPaint(0, 0, width, height, fractions, colors); diff --git a/src/org/openjump/core/ui/plugin/layer/pirolraster/ExtractSelectedPartOfImage.java b/src/org/openjump/core/ui/plugin/layer/pirolraster/ExtractSelectedPartOfImage.java index e8eb09cb2..644d4cc81 100644 --- a/src/org/openjump/core/ui/plugin/layer/pirolraster/ExtractSelectedPartOfImage.java +++ b/src/org/openjump/core/ui/plugin/layer/pirolraster/ExtractSelectedPartOfImage.java @@ -149,8 +149,8 @@ public boolean execute(PlugInContext context) throws Exception { RasterImageIO rasterImageIO = new RasterImageIO(); rasterImageIO.writeImage(outFile, raster, envWanted, - rasterImageIO.new CellSizeXY(rLayer.getMetadata().getOriginalCellSize(), - rLayer.getMetadata().getOriginalCellSize()), + rasterImageIO.new CellSizeXY(rLayer.getMetadata().getOriginalCellSize().getX(), + rLayer.getMetadata().getOriginalCellSize().getY()), rLayer.getMetadata().getNoDataValue()); String catName = StandardCategoryNames.WORKING; diff --git a/src/org/openjump/core/ui/plugin/layer/pirolraster/WarpImageToFencePlugIn.java b/src/org/openjump/core/ui/plugin/layer/pirolraster/WarpImageToFencePlugIn.java index 0a87980d1..592477c4f 100644 --- a/src/org/openjump/core/ui/plugin/layer/pirolraster/WarpImageToFencePlugIn.java +++ b/src/org/openjump/core/ui/plugin/layer/pirolraster/WarpImageToFencePlugIn.java @@ -117,8 +117,8 @@ public boolean execute(PlugInContext context) throws Exception { RenderedOp outputOp = JAI.create("Scale", pb, null); rasterImageIO.writeImage(outFile, outputOp.copyData(), envWanted, - rasterImageIO.new CellSizeXY(rLayer.getMetadata().getOriginalCellSize(), - rLayer.getMetadata().getOriginalCellSize()), + rasterImageIO.new CellSizeXY(rLayer.getMetadata().getOriginalCellSize().getX(), + rLayer.getMetadata().getOriginalCellSize().getY()), rLayer.getMetadata().getNoDataValue()); String catName = StandardCategoryNames.WORKING; diff --git a/src/org/openjump/core/ui/util/LayerableUtil.java b/src/org/openjump/core/ui/util/LayerableUtil.java index df8dc6601..aa4e7b7b6 100644 --- a/src/org/openjump/core/ui/util/LayerableUtil.java +++ b/src/org/openjump/core/ui/util/LayerableUtil.java @@ -913,18 +913,19 @@ public static double getValidArea(Layer layer) { public static double getValidArea(RasterImageLayer layer) throws IOException { Raster ras=layer.getRasterData(null); double noData =layer.getNoDataValue(); - double cellSize=layer.getMetadata().getOriginalCellSize(); + double cellSizeX = layer.getMetadata().getOriginalCellSize().getX(); + double cellSizeY = layer.getMetadata().getOriginalCellSize().getY(); int counter = 0; int nx = ras.getWidth(); - int ny = ras.getHeight(); - for (int y = 0; y < ny; y++) { - for (int x = 0; x < nx; x++) { - double value = ras.getSampleDouble(x, y, 0); - if (value != noData) - counter++; - } + int ny = ras.getHeight(); + for (int y = 0; y < ny; y++) { + for (int x = 0; x < nx; x++) { + double value = ras.getSampleDouble(x, y, 0); + if (value != noData) + counter++; } - return cellSize*cellSize*counter; + } + return cellSizeX * cellSizeY * counter; } public static void main(String[] args) {