Revision: 6585 http://sourceforge.net/p/jump-pilot/code/6585 Author: ma15569 Date: 2020-10-08 10:27:49 +0000 (Thu, 08 Oct 2020) Log Message: ----------- rewrite class in order to speedup the process. Added some output method (saveToFile and getRaster)
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-06 21:04:17 UTC (rev 6584) +++ core/trunk/src/org/openjump/core/rasterimage/algorithms/RasterizeAlgorithm.java 2020-10-08 10:27:49 UTC (rev 6585) @@ -45,106 +45,109 @@ */ + public class RasterizeAlgorithm { - private static Double noData= -99999.0D; + private static Double noData = -99999.0D; private static Double cellSize; private static double dValue; private static int m_iNX; private static int m_iNY; private static GridExtent m_Extent; - public static WritableRaster raster; - - - //[Giuseppe Aruta 2020-10-4] used to methods to rasterize: + private static WritableRaster raster; + private static FeatureCollection featureCollection; + private static String attrName; + private static double[][] values; + private static Envelope env; + + public RasterizeAlgorithm(Envelope limitEnvelope, FeatureCollection fCollection, + String attributeName, double CellSize) throws OutOfMemoryError, Exception { + featureCollection = fCollection; + env=limitEnvelope; + attrName=attributeName; + 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); + m_iNX = m_Extent.getNX(); + m_iNY = m_Extent.getNY(); + values= new double[m_iNX][m_iNY]; + for (int x = 0; x < m_iNX; x++){ + for (int y = 0; y < m_iNY; y++){ + values[x][y]=noData; + } + } + } + + + //[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 + // 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 + * Convert a feature collection to a raster according to a numeric attribute, a limit envelope + * and a cell size. Feature are first selected by the envelope and merged according + * the chosen attribute, then converted to a grid */ - 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); - } + public void process() throws OutOfMemoryError, Exception { + + FeatureCollection fc2 = getFeaturesOverlappingEnvelope(); + FeatureCollection fc3 = unionByAttributeValue(fc2); + if (!LayerableUtil.isPolygonalLayer(fc3)) { + RasterizeAlgorithm.RasterizeAdbToolbox(fc3); + } else { + RasterizeAlgorithm.RasterizeSextante(fc3); + } + } - - - - - /** - * Method to rasterize a FeatureCollection using AdBToolboxframework + + /** + * Method to save results to a TIFF file * @param file - * @param limitEnvelope - * @param fCollection - * @param attributeName - * @param CellSize - * @throws OutOfMemoryError + * @throws IOException + */ + + public void saveToFile(File file) throws IOException { + Envelope m_Envelope = new Envelope(m_Extent.getXMin(), m_Extent.getXMax(),m_Extent.getYMin(), m_Extent.getYMax() ); + RasterImageIO rasterImageIO = new RasterImageIO(); + rasterImageIO.writeImage(file, raster, m_Envelope, + rasterImageIO.new CellSizeXY(cellSize, cellSize), noData); + } + + /** + * Rasterize a FeatureCollection using AdBToolboxframework * @throws Exception */ - 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; - } - } - final Iterator<?> iter = fCollection.iterator(); + private static void RasterizeAdbToolbox(FeatureCollection fCollection) throws OutOfMemoryError, Exception { + 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); + try { + dValue = Double.parseDouble(feature.getAttribute(attrName).toString()); + } catch (Exception e) { + dValue = noData; + } + double[][] rasterized = new double[m_iNX][m_iNY]; + rasterized = rasterize(feature.getGeometry()); 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; + values[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); + raster = GridRasterWrapper.matrixToRaster(values); } - - + + /** * Converts World coordinates to grid coordinates * @param Coordinate coordinate @@ -160,161 +163,25 @@ } + - 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 - * @param Envelope limitEnvelope - * @param Layer m_Layer - * @param String attributeName - * @param double CellSize - * @param double NoData - * @throws IOException + * Method Rasterize a FeatureCollection using Sextante framework + * @throws Exception + * @throws OutOfMemoryError */ - private static void RasterizeSextante(File file, Envelope limitEnvelope, FeatureCollection fCollection, - String attributeName, double CellSize ) throws IOException { + private static void RasterizeSextante(FeatureCollection fCollection ) 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);//limitEnvelope.getMaxX()); - m_Extent.setYRange(minY, maxY);//limitEnvelope.getMaxY()); - minX = m_Extent.getXMin(); - minY = m_Extent.getYMin(); - maxX = m_Extent.getXMax(); - maxY = m_Extent.getYMax(); - //Recalculate cols and rows to avoid resampling of cell size - 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); - final Coordinate[] coords = new Coordinate[5]; - coords[0] = new Coordinate(minX, minY); - coords[1] = new Coordinate(minX, maxY); - coords[2] = new Coordinate(maxX, maxY); - coords[3] = new Coordinate(maxX, minY); - coords[4] = new Coordinate(minX, minY); - - + raster = GridRasterWrapper.matrixToRaster(values); + final Coordinate[] coords = new Coordinate[5]; + coords[0] = new Coordinate(m_Extent.getXMin(), m_Extent.getYMin()); + coords[1] = new Coordinate(m_Extent.getXMin(), m_Extent.getYMax()); + coords[2] = new Coordinate(m_Extent.getXMax(), m_Extent.getYMax()); + coords[3] = new Coordinate(m_Extent.getXMax(), m_Extent.getYMin()); + coords[4] = new Coordinate(m_Extent.getXMin(), m_Extent.getYMin()); final GeometryFactory gf = new GeometryFactory(); - final LinearRing ring = gf.createLinearRing(coords); - final Polygon extent = gf.createPolygon(ring, null); - - + 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); @@ -321,30 +188,31 @@ for (Iterator<Feature> it = inputFC.iterator() ; it.hasNext() ; ) { Feature f = it.next(); try { - dValue = Double.parseDouble(f.getAttribute(attributeName).toString()); + dValue = Double.parseDouble(f.getAttribute(attrName).toString()); } catch (Exception e) { - dValue = noData; + dValue = noData; } - - final Geometry geometry = f.getGeometry(); - - - if (geometry.intersects(extent)) { - - doGeometry(geometry); - } + final Geometry geometry = f.getGeometry(); + if (geometry.intersects(extent)) { + doGeometry(geometry); + } } - RasterImageIO rasterImageIO = new RasterImageIO(); - rasterImageIO.writeImage(file, raster, extent.getEnvelopeInternal(), - rasterImageIO.new CellSizeXY(CellSize, CellSize),noData ); + } - + /** + * Gets java.awt.image.WritableRaster + * @return java.awt.image.WritableRaster + */ + public WritableRaster getRaster() { + return raster; } - - - private static void doPolygon(final Geometry geom) { - - final GeometryFactory gf = new GeometryFactory(); + + + + + + private static void doPolygon(final Geometry geom) { + final GeometryFactory gf = new GeometryFactory(); for (int i = 0; i < geom.getNumGeometries(); i++) { final Polygon poly = (Polygon) geom.getGeometryN(i); LinearRing lr = gf.createLinearRing(poly.getExteriorRing().getCoordinates()); @@ -356,14 +224,12 @@ doPolygonPart(part, true); } } + } - } - private static void doPolygonPart(final Polygon geom, final boolean bIsHole) { - - boolean bFill; + boolean bFill; boolean bCrossing[]; int x, y, ix, xStart, xStop, iPoint; double yPos;; @@ -370,38 +236,29 @@ Coordinate pLeft, pRight, pa, pb; final Coordinate p = new Coordinate(); bCrossing = new boolean[m_iNX]; - - final Envelope extent = geom.getEnvelopeInternal(); - + final Envelope extent = geom.getEnvelopeInternal(); xStart = (int) ((extent.getMinX()- m_Extent.getXMin()) / m_Extent.getCellSize().x) - 1; if (xStart < 0) { xStart = 0; } - - xStop = (int) ((extent.getMaxX()- m_Extent.getXMin()) / m_Extent.getCellSize().x) + 1; + xStop = (int) ((extent.getMaxX()- m_Extent.getXMin()) / m_Extent.getCellSize().x) + 1; if (xStop >= m_iNX) { xStop = m_iNX - 1; } - - final Coordinate[] points = geom.getCoordinates(); - - for (y = 0, yPos = m_Extent.getYMax(); y < m_iNY; y++, yPos -= m_Extent.getCellSize().y) { + final Coordinate[] points = geom.getCoordinates(); + for (y = 0, yPos = m_Extent.getYMax(); y < m_iNY; y++, yPos -= m_Extent.getCellSize().y + ) { if ((yPos >= extent.getMinY()) && (yPos <= extent.getMaxY())) { Arrays.fill(bCrossing, false); pLeft = new Coordinate(m_Extent.getXMin() - 1.0, yPos); pRight = new Coordinate(m_Extent.getXMax() + 1.0, yPos); - - pb = points[points.length - 1]; - + pb = points[points.length - 1]; for (iPoint = 0; iPoint < points.length; iPoint++) { pa = pb; pb = points[iPoint]; - if ((((pa.y <= yPos) && (yPos < pb.y)) || ((pa.y > yPos) && (yPos >= pb.y)))) { getCrossing(p, pa, pb, pLeft, pRight); - ix = (int) ((p.x - m_Extent.getXMin()) / m_Extent.getCellSize().x + 1.0); - if (ix < 0) { ix = 0; } @@ -408,11 +265,9 @@ else if (ix >= m_iNX) { ix = m_iNX - 1; } - bCrossing[ix] = !bCrossing[ix]; } } - for (x = xStart, bFill = false; x <= xStop; x++) { if (bCrossing[x]) { bFill = !bFill; @@ -422,13 +277,11 @@ if (bIsHole) { if (dPrevValue == dValue) { raster.setSample(x, y, 0, noData); - } } else { if (dPrevValue == noData) { raster.setSample(x, y, 0, dValue); - } } } @@ -435,23 +288,17 @@ } } } - } - - + private static void doLine(final Geometry geom) { - for (int i = 0; i < geom.getNumGeometries(); i++) { final Geometry part = geom.getGeometryN(i); doLineString(part); } - } - private static void doLineString(final Geometry geom) { - int i; double x, y, x2, y2; final Coordinate[] coords = geom.getCoordinates(); @@ -462,21 +309,16 @@ y2 = coords[i + 1].y; writeSegment(x, y, x2, y2); } - } - private static void writeSegment(double x, double y, final double x2, final double y2) { - double dx, dy, d, n; GridCell cell; - dx = Math.abs(x2 - x); dy = Math.abs(y2 - y); - if ((dx > 0.0) || (dy > 0.0)) { if (dx > dy) { dx /= cellSize; @@ -490,38 +332,31 @@ dx /= dy; dy = cellSize; } - if (x2 < x) { dx = -dx; } - if (y2 < y) { dy = -dy; } - for (d = 0.0; d <= n; d++, x += dx, y += dy) { if (m_Extent.contains(x, y)) { + // final GridCell cell = m_Extent.getGridCoordsFromWorldCoords(coord.x, coord.y); + // java.awt.Point cell1 = fromCoordToCell(new Coordinate(x,y), cellSize, m_Extent); cell = m_Extent.getGridCoordsFromWorldCoords(x, y); //System.out.println(cell.getX() + " " + cell.getY()); - - raster.setSample(cell.getX(), cell.getY(), 0,dValue); + raster.setSample(cell.getX(), cell.getY(), 0,dValue); } } } - } private static void doPoint(final Geometry geometry) { - final Coordinate coord = geometry.getCoordinate(); - final GridCell cell = m_Extent.getGridCoordsFromWorldCoords(coord.x, coord.y); - raster.setSample(cell.getX(), cell.getY(), 0,dValue); - + // final GridCell cell = m_Extent.getGridCoordsFromWorldCoords(coord.x, coord.y); + java.awt.Point cell = fromCoordToCell(coord, cellSize); + raster.setSample(cell.x, cell.y, 0,dValue); } - - - private static boolean getCrossing(final Coordinate crossing, @@ -529,7 +364,6 @@ final Coordinate a2, final Coordinate b1, final Coordinate b2) { - double lambda, div, a_dx, a_dy, b_dx, b_dy; a_dx = a2.x - a1.x; a_dy = a2.y - a1.y; @@ -545,7 +379,7 @@ } - public static void doGeometry (Geometry geometry) { + private static void doGeometry (Geometry geometry) { if (geometry.getGeometryType().equals("Point") || geometry.getGeometryType().equals("MultiPoint")) { doPoint(geometry); } else if (geometry.getGeometryType().equals("LineString") || geometry.getGeometryType().equals("MultiLineString")) { @@ -565,84 +399,184 @@ } } } + - public static FeatureCollection unionByAttributeValue(FeatureCollection featureCollection, String value) throws Exception { - FeatureDataset outputFC = new FeatureDataset(featureCollection.getFeatureSchema()); - - Map<Object, FeatureCollection> map = new HashMap<Object, FeatureCollection>(); - Iterator<Feature> itFeat= featureCollection.getFeatures().iterator(); - while (itFeat.hasNext()) { - Feature feature = itFeat.next(); - Object key = feature.getAttribute(value); - if (!map.containsKey(key)) { - FeatureCollection fd = new FeatureDataset(featureCollection.getFeatureSchema()); - fd.add(feature); - map.put(key, fd); - } else { - map.get(key).add(feature); - } - } - - Iterator<Object> iter = map.keySet().iterator(); - while (iter.hasNext()) { - Object key = iter.next(); - FeatureCollection fca = map.get(key); - if (fca.size() > 0) { - Feature feature = union(fca); - feature.setAttribute(value, key); - outputFC.add(feature); - } - } - - - return outputFC; + + private static FeatureCollection unionByAttributeValue(FeatureCollection featureCollection) throws Exception { + FeatureDataset outputFC = new FeatureDataset(featureCollection.getFeatureSchema()); + + Map<Object, FeatureCollection> map = new HashMap<Object, FeatureCollection>(); + Iterator<Feature> itFeat= featureCollection.getFeatures().iterator(); + while (itFeat.hasNext()) { + Feature feature = itFeat.next(); + Object key = feature.getAttribute(attrName); + if (!map.containsKey(key)) { + FeatureCollection fd = new FeatureDataset(featureCollection.getFeatureSchema()); + fd.add(feature); + map.put(key, fd); + } else { + map.get(key).add(feature); + } } - - - - - private static Feature union(FeatureCollection fc) { - GeometryFactory factory = new GeometryFactory(); - Collection<Geometry> geometries = new ArrayList<Geometry>(); - for (Feature f : fc.getFeatures()) { - Geometry g = f.getGeometry(); - geometries.add(g); - } - Geometry unioned = UnaryUnionOp.union(geometries); - FeatureSchema schema = fc.getFeatureSchema(); - Feature feature = new BasicFeature(schema); - if (geometries.size()==0) { - feature.setGeometry(factory.createGeometryCollection(new Geometry[]{})); - } - else { - feature.setGeometry(unioned); - } - return feature; - } - - - - public static FeatureCollection getFeaturesOverlappingEnvelope(FeatureCollection featureCollection, - Envelope env, String attributeName) throws Exception { - Collection<Feature> inputC = featureCollection.getFeatures(); - FeatureSchema schema1 = featureCollection.getFeatureSchema(); - FeatureDataset inputFC = new FeatureDataset(inputC, schema1); - - - FeatureSchema schema = new FeatureSchema(); - schema.addAttribute("GEOMETRY", AttributeType.GEOMETRY); - schema.addAttribute(attributeName, AttributeType.DOUBLE); - FeatureDataset outputFC = new FeatureDataset(schema); - GeometryFactory factory = new GeometryFactory(); - Geometry geom = factory.toGeometry(env); - - for (Feature f : inputFC.getFeatures()) { - Geometry g = f.getGeometry(); - if (!geom.disjoint(g)){ - outputFC.add(f);} - } - return outputFC; - } + Iterator<Object> iter = map.keySet().iterator(); + while (iter.hasNext()) { + Object key = iter.next(); + FeatureCollection fca = map.get(key); + if (fca.size() > 0) { + Feature feature = union(fca); + feature.setAttribute(attrName, key); + outputFC.add(feature); + // tree_map.put(feature.getID(), key.toString()); + } + } + + + return outputFC; + } + + + private static Feature union(FeatureCollection fc) { + GeometryFactory factory = new GeometryFactory(); + Collection<Geometry> geometries = new ArrayList<Geometry>(); + for (Feature f : fc.getFeatures()) { + Geometry g = f.getGeometry(); + geometries.add(g); + } + Geometry unioned = UnaryUnionOp.union(geometries); + FeatureSchema schema = fc.getFeatureSchema(); + Feature feature = new BasicFeature(schema); + if (geometries.size()==0) { + feature.setGeometry(factory.createGeometryCollection(new Geometry[]{})); + } + else { + feature.setGeometry(unioned); + } + return feature; + } + + + + private static FeatureCollection getFeaturesOverlappingEnvelope() throws Exception { + Collection<Feature> inputC = featureCollection.getFeatures(); + FeatureSchema schema1 = featureCollection.getFeatureSchema(); + FeatureDataset inputFC = new FeatureDataset(inputC, schema1); + FeatureSchema schema = new FeatureSchema(); + schema.addAttribute("GEOMETRY", AttributeType.GEOMETRY); + schema.addAttribute(attrName, AttributeType.DOUBLE); + FeatureDataset outputFC = new FeatureDataset(schema); + GeometryFactory factory = new GeometryFactory(); + Geometry geom = factory.toGeometry(env); + for (Feature f : inputFC.getFeatures()) { + Geometry g = f.getGeometry(); + if (!geom.disjoint(g)){ + outputFC.add(f);} + } + return outputFC; + } + + + + private static double[][] rasterize(Geometry geom) + 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; + } } 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-06 21:04:17 UTC (rev 6584) +++ core/trunk/src/org/openjump/core/ui/plugin/tools/generate/RasterizePlugIn.java 2020-10-08 10:27:49 UTC (rev 6585) @@ -292,8 +292,9 @@ FeatureCollection fc = sourceLayer.getFeatureCollectionWrapper(); final File outFile = FileUtil.addExtensionIfNone(new File(path), "tif"); monitor.report(RASTERIZING_VECTOR+"..."); - RasterizeAlgorithm.Rasterize(outFile, fix, fc, selAttribute, cellValue); - + RasterizeAlgorithm rasterize = new RasterizeAlgorithm(fix, fc, selAttribute, cellValue); + rasterize.process(); + rasterize.saveToFile(outFile); String catName = StandardCategoryNames.WORKING; try { _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel