Revision: 6573 http://sourceforge.net/p/jump-pilot/code/6573 Author: ma15569 Date: 2020-10-04 15:14:50 +0000 (Sun, 04 Oct 2020) Log Message: ----------- Extended rasterization to points and linestrings. Simplified the access to the algorithm and added some extra documentation
Modified Paths: -------------- core/trunk/src/org/openjump/core/rasterimage/algorithms/RasterizeAlgorithm.java core/trunk/src/org/openjump/core/ui/plugin/tools/generate/RasterizePlugIn.java Modified: core/trunk/src/org/openjump/core/rasterimage/algorithms/RasterizeAlgorithm.java =================================================================== --- core/trunk/src/org/openjump/core/rasterimage/algorithms/RasterizeAlgorithm.java 2020-10-04 12:56:02 UTC (rev 6572) +++ core/trunk/src/org/openjump/core/rasterimage/algorithms/RasterizeAlgorithm.java 2020-10-04 15:14:50 UTC (rev 6573) @@ -18,6 +18,7 @@ import org.openjump.core.rasterimage.sextante.rasterWrappers.GridCell; import org.openjump.core.rasterimage.sextante.rasterWrappers.GridExtent; import org.openjump.core.rasterimage.sextante.rasterWrappers.GridRasterWrapper; +import org.openjump.core.ui.util.LayerableUtil; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; @@ -51,206 +52,218 @@ private static double dValue; private static int m_iNX; private static int m_iNY; - - //private static OpenJUMPSextanteRasterLayer sRasterLayer; private static GridExtent m_Extent; - - - static WritableRaster raster; + public static WritableRaster raster; + + //[Giuseppe Aruta 2020-10-4] used to methods to rasterize: + // a) From AdbToolbox. Quite efficient with different types of geometries but slow + // b) From Sextante, almost faster but still not working with ponts and linestrings + // The code below simplefies the access to the the method + /** + * Convert a feature collection to a raster according to a numeric attribute, a limi envelope + * and a cell size. Raster is saved as TIFF file. + * Feature are first selected by the envelope and merged according the + * attribute, then converted to a java.awt.image.WritableRaster + * @param File file to save + * @param Envelope limitEnvelope + * @param FeatureCollection fCollection + * @param String attributeName + * @param double CellSize + * @throws OutOfMemoryError + * @throws Exception + */ + public static void Rasterize(File file, Envelope limitEnvelope, FeatureCollection fCollection, + String attributeName, double CellSize) throws OutOfMemoryError, Exception { + FeatureCollection fc = fCollection; + FeatureCollection fc2 = getFeaturesOverlappingEnvelope(fc, limitEnvelope, attributeName); + FeatureCollection fc3 = unionByAttributeValue(fc2, attributeName); + if (!LayerableUtil.isPolygonalLayer(fCollection)) { + RasterizeAlgorithm.RasterizeAdbToolbox(file, limitEnvelope, fc3, attributeName, CellSize); + } else { + RasterizeAlgorithm.RasterizeSextante(file, limitEnvelope, fc3, attributeName, CellSize); + } + } + + + + + /** + * Method to rasterize a FeatureCollection using AdBToolboxframework + * @param file + * @param limitEnvelope + * @param fCollection + * @param attributeName + * @param CellSize + * @throws OutOfMemoryError + * @throws Exception + */ - /** - * Method to rasterize a FeatureCollection using AdBToolbox framework - * @TODO check why the output shows non exact values - * @param file - * @param Envelope limitEnvelope - * @param Layer m_Layer - * @param String attributeName - * @param double CellSize - * @param double NoData - * @throws IOException - - */ - - public static void RasterizeAdbToolbox(File file, Envelope limitEnvelope, FeatureCollection fCollection, String attributeName, double CellSize) throws IOException { - - cellSize=CellSize; - m_Extent= new GridExtent(); - m_Extent.setCellSize(CellSize, CellSize); - m_Extent.setXRange(limitEnvelope.getMinX(), limitEnvelope.getMaxX()); - m_Extent.setYRange(limitEnvelope.getMinY(), limitEnvelope.getMaxY()); - + + private static void RasterizeAdbToolbox(File file, Envelope limitEnvelope, FeatureCollection fCollection, + String attributeName, double CellSize) throws OutOfMemoryError, Exception { + cellSize=CellSize; + m_Extent= new GridExtent(); + m_Extent.setCellSize(CellSize, CellSize); + double minX = limitEnvelope.getMinX(); + double minY = limitEnvelope.getMinY(); + double maxX = limitEnvelope.getMaxX(); + double maxY = limitEnvelope.getMaxY(); + m_Extent.setXRange(minX, maxX); + m_Extent.setYRange(minY, maxY); + minX = m_Extent.getXMin(); + minY = m_Extent.getYMin(); + maxX = m_Extent.getXMax(); + maxY = m_Extent.getYMax(); m_iNX = m_Extent.getNX(); - m_iNY = m_Extent.getNY(); - double[][] valori= new double[m_iNX][m_iNY]; - - for (int x = 0; x < m_iNX; x++){ - for (int y = 0; y < m_iNY; y++){ - valori[x][y]=noData; - - } - } - - raster = GridRasterWrapper.matrixToRaster(valori); - BufferedImage bimage = new BufferedImage(m_iNX, m_iNY, BufferedImage.TYPE_INT_ARGB); - bimage.setAccelerationPriority(1.0f); - Graphics2D graphics = bimage.createGraphics(); - - Coordinate[] coord; - int[] coordGridX; - int[] coordGridY; - - Color color = new Color(100); - graphics.setPaint(color); - graphics.setPaintMode(); - - - - - final Coordinate[] coords = new Coordinate[5]; - coords[0] = new Coordinate(limitEnvelope.getMinX(), limitEnvelope.getMinY()); - coords[1] = new Coordinate(limitEnvelope.getMinX(), limitEnvelope.getMaxY()); - coords[2] = new Coordinate(limitEnvelope.getMaxX(),limitEnvelope.getMaxY()); - coords[3] = new Coordinate(limitEnvelope.getMaxX(),limitEnvelope.getMinY()); - coords[4] = new Coordinate(limitEnvelope.getMinX(), limitEnvelope.getMinY()); - - - final GeometryFactory gf = new GeometryFactory(); - final LinearRing ring = gf.createLinearRing(coords); - final Polygon extent = gf.createPolygon(ring, null); - - - List<Feature> inputC = fCollection.getFeatures(); - FeatureSchema schema = fCollection.getFeatureSchema(); - FeatureDataset inputFC = new FeatureDataset(inputC, schema); - for (Iterator<Feature> it = inputFC.iterator() ; it.hasNext() ; ) { - Feature f = it.next(); - dValue = Double.parseDouble(f.getAttribute(attributeName).toString()); - final Geometry geom = f.getGeometry(); - - if (geom.intersects(extent)) { - for(int g=0; g<geom.getNumGeometries(); g++){ - // Check if polygons has holes - if(geom.getGeometryN(g).getGeometryType().equals("Polygon")){ - Polygon polygon = (Polygon) geom.getGeometryN(g); - java.awt.geom.Area awtArea; - if(polygon.getNumInteriorRing() > 0){ - // Holes found - // Exterior ring - coord = polygon.getExteriorRing().getCoordinates(); - coordGridX = new int[coord.length]; - coordGridY = new int[coord.length]; - - // From geographic coords to image coords - for(int p=0; p<coord.length; p++){ - java.awt.Point point = fromCoordToCell(coord[p], CellSize, extent); - coordGridX[p] = point.x; - coordGridY[p] = point.y; - } - - java.awt.Polygon awtPolygon = new java.awt.Polygon(coordGridX, coordGridY, coord.length); - awtArea = new java.awt.geom.Area(awtPolygon); - - // Subtract inner rings - for(int ir=0; ir<polygon.getNumInteriorRing(); ir++){ - coord = polygon.getInteriorRingN(ir).getCoordinates(); - coordGridX = new int[coord.length]; - coordGridY = new int[coord.length]; - // From geographic coords to image coords - for(int p=0; p<coord.length; p++){ - java.awt.Point point = fromCoordToCell(coord[p], CellSize, extent); - coordGridX[p] = point.x; - coordGridY[p] = point.y; - } - awtPolygon = new java.awt.Polygon(coordGridX, coordGridY, coord.length); - java.awt.geom.Area awtArea2 = new java.awt.geom.Area(awtPolygon); - awtArea.subtract(awtArea2); - } - }else{ - coord = polygon.getCoordinates(); - coordGridX = new int[coord.length]; - coordGridY = new int[coord.length]; - - // From geographic coords to image coords - for(int p=0; p<coord.length; p++){ - java.awt.Point point = fromCoordToCell(coord[p], CellSize, extent); - coordGridX[p] = point.x; - coordGridY[p] = point.y; - } - java.awt.Polygon awtPolygon = new java.awt.Polygon(coordGridX, coordGridY, coord.length); - awtArea = new java.awt.geom.Area(awtPolygon); - } - - graphics.setPaint(color); - graphics.setPaintMode(); - graphics.draw(awtArea); - graphics.fill(awtArea); - - }else{ - coord = geom.getGeometryN(g).getCoordinates(); - coordGridX = new int[coord.length]; - coordGridY = new int[coord.length]; - - // From geographic coords to image coords - for(int p=0; p<coord.length; p++){ - java.awt.Point point = fromCoordToCell(coord[p], CellSize, extent); - coordGridX[p] = point.x; - coordGridY[p] = point.y; - } - if(geom.getGeometryN(g).getGeometryType().equals("LineString") || geom.getGeometryN(g).getGeometryType().equals("MultiLineString")){ - graphics.setPaint(color); - graphics.setPaintMode(); - graphics.drawPolyline(coordGridX, coordGridY, coord.length); - }else if(geom.getGeometryN(g).getGeometryType().equals("Point") || geom.getGeometryN(g).getGeometryType().equals("MultiPoint")){ - graphics.setPaint(color); - graphics.setPaintMode(); - graphics.fillRect(coordGridX[0], coordGridY[0], 1, 1); - } - } - } - } - for (int x=0; x < m_iNX; x++ ) { - for (int y=0; y < m_iNY; y++ ) { - if(bimage.getRGB(x, y) != 0 && bimage.getRGB(x, y) != -1){ - valori[x][y]=1; - } - } - } - } - for (Iterator<Feature> it = inputFC.iterator() ; it.hasNext() ; ) { - Feature f = it.next(); - dValue = Double.parseDouble(f.getAttribute(attributeName).toString()); - raster = GridRasterWrapper.matrixToRaster(valori); - for (int x=0; x < m_iNX; x++ ) { - for (int y=0; y < m_iNY; y++ ) { - if( valori[x][y]==1){ - raster.setSample(x, y, 0, dValue); - } - } - } - } - - - RasterImageIO rasterImageIO = new RasterImageIO(); - rasterImageIO.writeImage(file, raster, limitEnvelope, - rasterImageIO.new CellSizeXY(CellSize, CellSize), noData); - + m_iNY = m_Extent.getNY(); + double[][] valori= new double[m_iNX][m_iNY]; + for (int x = 0; x < m_iNX; x++){ + for (int y = 0; y < m_iNY; y++){ + valori[x][y]=noData; + } + } + final Iterator<?> iter = fCollection.iterator(); + while (iter.hasNext()) { + Feature feature = (Feature) iter.next(); + dValue = Double.parseDouble(feature.getAttribute(attributeName).toString()); + double[][] rasterized = new double[m_iNX][m_iNY]; + rasterized = rasterize(feature.getGeometry(), cellSize); + for (int r = 1; r < m_iNX; r++) { + for (int c = 1; c < m_iNY; c++) { + if (rasterized[r][c] == 1) { + valori[r][c] = dValue; + } + } + } + } + raster = GridRasterWrapper.matrixToRaster(valori); + Envelope m_Envelope = new Envelope(minX, maxX,minY, maxY ); + RasterImageIO rasterImageIO = new RasterImageIO(); + rasterImageIO.writeImage(file, raster, m_Envelope, + rasterImageIO.new CellSizeXY(CellSize, CellSize), noData); } - private static java.awt.Point fromCoordToCell(Coordinate coord, double CellSize, Polygon extent){ - Envelope env = extent.getEnvelopeInternal(); - int x = (int)((coord.x - env.getMinX()) / CellSize); - int y = (int)((coord.y - env.getMinY()) / CellSize); - + /** + * Converts World coordinates to grid coordinates + * @param Coordinate coordinate + * @param double CellSize + * @return + */ + + private static java.awt.Point fromCoordToCell(Coordinate coordinate, double CellSize){ + int x = (int)Math.floor((coordinate.x - m_Extent.getXMin()) / CellSize); + // int y = (int)Math.floor((m_Extent.getYMax()-coord.y) / CellSize); + int y = (int)Math.floor((coordinate.y-m_Extent.getYMin()) / CellSize); return new java.awt.Point(x, y); } + private static double[][] rasterize(Geometry geom, double cellSize) + throws Exception, OutOfMemoryError { + double[][] grid = new double[m_iNX+2][m_iNY+2]; + for(int row = 0; row <= m_iNY; row++){ + for(int col = 0; col <= m_iNX; col++){ + grid[col][row] = 0; + } + } + BufferedImage bimage = new BufferedImage(m_iNX, m_iNY, BufferedImage.TYPE_INT_ARGB); + bimage.setAccelerationPriority(1.0f); + Graphics2D graphics = bimage.createGraphics(); + Coordinate[] coord; + int[] coordGridX; + int[] coordGridY; + Color color = new Color(100); + graphics.setPaint(color); + graphics.setPaintMode(); + for(int g=0; g<geom.getNumGeometries(); g++){ + // Check if polygons has holes + if(geom.getGeometryN(g).getGeometryType().equals("Polygon")){ + Polygon polygon = (Polygon) geom.getGeometryN(g); + java.awt.geom.Area awtArea; + if(polygon.getNumInteriorRing() > 0){ + // Holes found + // Exterior ring + coord = polygon.getExteriorRing().getCoordinates(); + coordGridX = new int[coord.length]; + coordGridY = new int[coord.length]; + // From geographic coords to image coords + for(int p=0; p<coord.length; p++){ + java.awt.Point point = fromCoordToCell(coord[p], cellSize); + coordGridX[p] = point.x; + coordGridY[p] = point.y; + } + java.awt.Polygon awtPolygon = new java.awt.Polygon(coordGridX, coordGridY, coord.length); + awtArea = new java.awt.geom.Area(awtPolygon); + // Subtract inner rings + for(int ir=0; ir<polygon.getNumInteriorRing(); ir++){ + coord = polygon.getInteriorRingN(ir).getCoordinates(); + coordGridX = new int[coord.length]; + coordGridY = new int[coord.length]; + // From geographic coords to image coords + for(int p=0; p<coord.length; p++){ + java.awt.Point point = fromCoordToCell(coord[p], cellSize); + coordGridX[p] = point.x; + coordGridY[p] = point.y; + } + awtPolygon = new java.awt.Polygon(coordGridX, coordGridY, coord.length); + java.awt.geom.Area awtArea2 = new java.awt.geom.Area(awtPolygon); + awtArea.subtract(awtArea2); + } + }else{ + coord = polygon.getCoordinates(); + coordGridX = new int[coord.length]; + coordGridY = new int[coord.length]; + // From geographic coords to image coords + for(int p=0; p<coord.length; p++){ + java.awt.Point point = fromCoordToCell(coord[p], cellSize); + coordGridX[p] = point.x; + coordGridY[p] = point.y; + } + java.awt.Polygon awtPolygon = new java.awt.Polygon(coordGridX, coordGridY, coord.length); + awtArea = new java.awt.geom.Area(awtPolygon); + } + + graphics.setPaint(color); + graphics.setPaintMode(); + graphics.draw(awtArea); + graphics.fill(awtArea); + }else{ + coord = geom.getGeometryN(g).getCoordinates(); + coordGridX = new int[coord.length]; + coordGridY = new int[coord.length]; + + // From geographic coords to image coords + for(int p=0; p<coord.length; p++){ + java.awt.Point point = fromCoordToCell(coord[p], cellSize); + coordGridX[p] = point.x; + coordGridY[p] = point.y; + } + if(geom.getGeometryN(g).getGeometryType().equals("LineString") || geom.getGeometryN(g).getGeometryType().equals("MultiLineString")){ + graphics.setPaint(color); + graphics.setPaintMode(); + graphics.drawPolyline(coordGridX, coordGridY, coord.length); + }else if(geom.getGeometryN(g).getGeometryType().equals("Point") || geom.getGeometryN(g).getGeometryType().equals("MultiPoint")){ + graphics.setPaint(color); + graphics.setPaintMode(); + graphics.fillRect(coordGridX[0], coordGridY[0], 1, 1); + } + } + } + for(int r=0; r<m_iNY; r++){ + for(int c=0; c<m_iNX; c++){ + if(bimage.getRGB(c, r) != 0 && bimage.getRGB(c, r) != -1){ + + grid[c+1][m_iNY-r] = 1; + } + } + } + return grid; + } - /** * Method to rasterize a FeatureCollection using Sextante framework * @param file @@ -261,7 +274,7 @@ * @param double NoData * @throws IOException */ - public static void RasterizeSextante(File file, Envelope limitEnvelope, FeatureCollection fCollection, + private static void RasterizeSextante(File file, Envelope limitEnvelope, FeatureCollection fCollection, String attributeName, double CellSize ) throws IOException { cellSize=CellSize; Modified: core/trunk/src/org/openjump/core/ui/plugin/tools/generate/RasterizePlugIn.java =================================================================== --- core/trunk/src/org/openjump/core/ui/plugin/tools/generate/RasterizePlugIn.java 2020-10-04 12:56:02 UTC (rev 6572) +++ core/trunk/src/org/openjump/core/ui/plugin/tools/generate/RasterizePlugIn.java 2020-10-04 15:14:50 UTC (rev 6573) @@ -291,11 +291,8 @@ monitor.allowCancellationRequests(); FeatureCollection fc = sourceLayer.getFeatureCollectionWrapper(); final File outFile = FileUtil.addExtensionIfNone(new File(path), "tif"); - monitor.report(PREPARING_VECTOR+"..."); - FeatureCollection fc2 = RasterizeAlgorithm.getFeaturesOverlappingEnvelope(fc, fix, selAttribute); - FeatureCollection fc3 = RasterizeAlgorithm.unionByAttributeValue(fc2, selAttribute); monitor.report(RASTERIZING_VECTOR+"..."); - RasterizeAlgorithm.RasterizeSextante(outFile, fix, fc3, selAttribute, cellValue); + RasterizeAlgorithm.Rasterize(outFile, fix, fc, selAttribute, cellValue); String catName = StandardCategoryNames.WORKING; _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel