Revision: 6012
          http://sourceforge.net/p/jump-pilot/code/6012
Author:   michaudm
Date:     2018-12-02 15:37:12 +0000 (Sun, 02 Dec 2018)
Log Message:
-----------
Clean/improve IntersectPolygonLayersPlugIn

Modified Paths:
--------------
    core/trunk/ChangeLog
    
core/trunk/src/org/openjump/core/ui/plugin/tools/IntersectPolygonLayersPlugIn.java

Modified: core/trunk/ChangeLog
===================================================================
--- core/trunk/ChangeLog        2018-12-02 11:53:17 UTC (rev 6011)
+++ core/trunk/ChangeLog        2018-12-02 15:37:12 UTC (rev 6012)
@@ -3,6 +3,9 @@
 # 2. make sure that lines break at 80 chars for constricted display situations
 #<-------------------------------- 80 chars 
---------------------------------->#
 
+2018-12-02
+  * Make IntersectPolygonLayersPlugIn faster
+
 2018-12-01 Giuseppe Aruta.
    * Added a standard icon from Kosmo Saig to RasterLegendPlugIn, 
      WMSLegendPlugIn and (Layer) LegendPlugIn 

Modified: 
core/trunk/src/org/openjump/core/ui/plugin/tools/IntersectPolygonLayersPlugIn.java
===================================================================
--- 
core/trunk/src/org/openjump/core/ui/plugin/tools/IntersectPolygonLayersPlugIn.java
  2018-12-02 11:53:17 UTC (rev 6011)
+++ 
core/trunk/src/org/openjump/core/ui/plugin/tools/IntersectPolygonLayersPlugIn.java
  2018-12-02 15:37:12 UTC (rev 6012)
@@ -28,18 +28,14 @@
 
 package org.openjump.core.ui.plugin.tools;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
-import org.openjump.core.geomutils.algorithm.GeometryConverter;
+import com.vividsolutions.jts.algorithm.locate.SimplePointInAreaLocator;
+import com.vividsolutions.jts.geom.*;
+import com.vividsolutions.jts.geom.util.LinearComponentExtracter;
+import com.vividsolutions.jts.operation.linemerge.LineMerger;
 import org.openjump.core.geomutils.algorithm.IntersectGeometries;
 
-import com.vividsolutions.jts.geom.Geometry;
-import com.vividsolutions.jts.geom.MultiPolygon;
-import com.vividsolutions.jts.geom.Point;
-import com.vividsolutions.jts.geom.Polygon;
 import com.vividsolutions.jts.index.SpatialIndex;
 import com.vividsolutions.jts.index.strtree.STRtree;
 import com.vividsolutions.jts.operation.polygonize.Polygonizer;
@@ -49,7 +45,6 @@
 import com.vividsolutions.jump.feature.Feature;
 import com.vividsolutions.jump.feature.FeatureCollection;
 import com.vividsolutions.jump.feature.FeatureDataset;
-import com.vividsolutions.jump.feature.FeatureDatasetFactory;
 import com.vividsolutions.jump.feature.FeatureSchema;
 import com.vividsolutions.jump.task.TaskMonitor;
 import com.vividsolutions.jump.tools.AttributeMapping;
@@ -76,7 +71,6 @@
  * TODO: translate Error messages
  * 
  */
-
 public class IntersectPolygonLayersPlugIn extends ThreadedBasePlugIn {
 
        private final static String LAYER1 = GenericNames.LAYER_A;
@@ -84,19 +78,13 @@
        private final static String sTRANSFER = I18N
                        
.get("org.openjump.plugin.tools.IntersectPolygonLayersPlugIn.Transfer-attributes");
        private String sDescription = "Intersects all geometries of two layers 
that contain both polygons. Note: The Planar Graph function provides similar 
functionality.";
-       private final static String sAccurracy = "Set calculation accuray in 
map units";
-       // -- reset in execute to correct language
-       private MultiInputDialog dialog;
-       private Layer layer1 = null; 
+       private Layer layer1 = null;
        private Layer layer2 = null;
-       private String methodNameToRun;
        private boolean exceptionThrown = false;
-       private PlugInContext context = null;
        private boolean transferAtt = true;
-       private double accurracy = 0.01; 
-       
+
        public void initialize(PlugInContext context) throws Exception {
-               context.getFeatureInstaller().addMainMenuItem(
+               context.getFeatureInstaller().addMainMenuPlugin(
                                this,
                                new String[] {MenuNames.TOOLS, 
MenuNames.TOOLS_ANALYSIS},
                                this.getName(),
@@ -134,17 +122,16 @@
                                
.get("org.openjump.plugin.tools.IntersectPolygonLayersPlugIn.Intersect-Polygon-Layers")
 + "...";
        }
 
-       public void run(TaskMonitor monitor, PlugInContext context)
-                       throws Exception {
-               this.context = context;
+       public void run(TaskMonitor monitor, PlugInContext context) throws 
Exception {
                monitor.allowCancellationRequests();
-               FeatureSchema featureSchema = new FeatureSchema();
                FeatureCollection resultColl = runIntersectionNew(layer1
                                .getFeatureCollectionWrapper(), layer2
                                .getFeatureCollectionWrapper(), 
this.transferAtt, monitor,
                                context);
                if ((resultColl != null) && (resultColl.size() > 0)) {
-                       context.addLayer(StandardCategoryNames.RESULT, 
I18N.get("ui.plugin.analysis.GeometryFunctionPlugIn.intersection") + "-" + 
layer1.getName() +"-"+ layer2.getName(),
+                       context.addLayer(StandardCategoryNames.RESULT,
+                                                       
I18N.get("ui.plugin.analysis.GeometryFunctionPlugIn.intersection") + "-" +
+                                                                               
        layer1.getName() + "-" + layer2.getName(),
                                        resultColl);
                }
                if (exceptionThrown)
@@ -163,9 +150,9 @@
         * otherwise the attributes are transferred. The later step assumes 
that a new created
         * intersection polygon has at max only one correspondent polygon per 
layer.
         * 
-        * @param fcA
-        * @param fcB
-        * @param transfer Attributes should attributes be transfered?
+        * @param fcA first FeatureCollection
+        * @param fcB second FeatureCollection
+        * @param transferAttributes Attributes should attributes be transfered?
         * @param monitor can be null
         * @param context can be null
         * @return a FeatureCollection that contains the result of the 
intersection
@@ -174,141 +161,123 @@
        private FeatureCollection runIntersectionNew(FeatureCollection fcA,
                        FeatureCollection fcB, boolean transferAttributes,
                        TaskMonitor monitor, PlugInContext context) {
-               FeatureCollection fd = null;
-               // -- put all geoms in one list and calculate their 
intersections
-               // i.e. iterate until pure
-               ArrayList<Geometry> geomsToCheck = new ArrayList<Geometry>();
-               for (Iterator iterator = fcA.iterator(); iterator.hasNext();) {
-                       Feature f = (Feature) iterator.next();
-                       geomsToCheck.add(f.getGeometry());
+
+               // put all geoms in a single list and prepare two indexes
+               monitor.report("Extract linearComponents and create indexes");
+               Collection<LineString> linearComponents = new ArrayList<>();
+               for (Feature f : fcA.getFeatures()) {
+                       LinearComponentExtracter.getLines(f.getGeometry(), 
linearComponents);
                }
-               for (Iterator iterator = fcB.iterator(); iterator.hasNext();) {
-                       Feature f = (Feature) iterator.next();
-                       geomsToCheck.add(f.getGeometry());
+               for (Feature f : fcB.getFeatures()) {
+                       LinearComponentExtracter.getLines(f.getGeometry(), 
linearComponents);
                }
-               // -- sort out the different geometry types and receive Lines
-               ArrayList lines = new ArrayList();
 
-               for (Iterator iterator = geomsToCheck.iterator(); 
iterator.hasNext();) {
-                       Geometry geom = (Geometry) iterator.next();
-                       if ((geom instanceof Polygon) || (geom instanceof 
MultiPolygon)) {
-                               // everything is fine
-                               // -- get Lines
-                               
lines.addAll(GeometryConverter.transformPolygonToLineStrings(geom));
-                       } else {
-                               // --
-                               if (context != null) {
-                                       context.getWorkbenchFrame().warnUser(
-                                                       
I18N.get("org.openjump.plugin.tools.IntersectPolygonLayersPlugIn.Geometry-no-Polygon-or-Multi-Polygon"));
+               // de-duplicate segments
+               monitor.report("De-duplicate segments");
+               Set<LineString> lines = new HashSet<>();
+               GeometryFactory gf = new GeometryFactory();
+               for (LineString linearComponent : linearComponents) {
+                       Coordinate[] coordinates = 
linearComponent.getCoordinates();
+                       for (int i = 1 ; i < coordinates.length ; i++) {
+                               LineString line;
+                               if (coordinates[i-1].x < coordinates[i].x) {
+                                       line = gf.createLineString(new 
Coordinate[]{coordinates[i - 1], coordinates[i]});
+                               } else if (coordinates[i-1].x > 
coordinates[i].x) {
+                                       line = gf.createLineString(new 
Coordinate[]{coordinates[i], coordinates[i-1]});
+                               } else if (coordinates[i-1].y < 
coordinates[i].y) {
+                                       line = gf.createLineString(new 
Coordinate[]{coordinates[i-1], coordinates[i]});
+                               } else {
+                                       line = gf.createLineString(new 
Coordinate[]{coordinates[i], coordinates[i-1]});
                                }
-                               // --
-                               return null;
+                               lines.add(line);
                        }
                }
+               linearComponents.clear();
+
+               monitor.report("Merge segments into LineStrings");
+               LineMerger merger = new LineMerger();
+               merger.add(lines);
+               lines.clear();
+               linearComponents = merger.getMergedLineStrings();
+
                //-- calculate the intersections and use the Polygonizer
-               Collection nodedLines = IntersectGeometries.nodeLines((List) 
lines);
-           Polygonizer polygonizer = new Polygonizer();
-           for (Iterator i = nodedLines.iterator(); i.hasNext(); ) {
-               Geometry g = (Geometry) i.next();
-               polygonizer.add(g);
-             }
-           //-- get the Polygons
-               Collection withoutIntersection = polygonizer.getPolygons();
-               //-- check if the polygon has a correspondent 
-               //       if yes, transfer the attributes - if no: remove the 
polygon
-               
-               //-- build a tree for the existing layers first.
-               SpatialIndex treeA = new STRtree();
-               for (Iterator iterator = fcA.iterator(); iterator.hasNext();) {
-                       Feature f = (Feature) iterator.next();
-                       treeA.insert(f.getGeometry().getEnvelopeInternal(), f);
-               }
-               SpatialIndex treeB = new STRtree();
-               for (Iterator iterator = fcB.iterator(); iterator.hasNext();) {
-                       Feature f = (Feature) iterator.next();
-                       treeB.insert(f.getGeometry().getEnvelopeInternal(), f);
-               }
+               monitor.report("Node the linework");
+               Collection nodedLines = 
IntersectGeometries.nodeLines(linearComponents);
+               linearComponents.clear();
+         Polygonizer polygonizer = new Polygonizer();
+         polygonizer.add(nodedLines);
+               nodedLines.clear();
+
+         //-- get the Polygons
+               monitor.report("Polygonize");
+               Collection<Geometry> withoutIntersection = 
polygonizer.getPolygons();
+               polygonizer = null;
+
                // -- get all intersecting features (usually there should be 
only one
                // corresponding feature per layer)
                // to avoid problems with spatial predicates we do the query 
for an
                // internal point of the result polygons
                // and apply an point in polygon test
+               monitor.report("Attribute mapping");
                AttributeMapping mapping = new 
AttributeMapping(fcA.getFeatureSchema(),
                                fcB.getFeatureSchema());
+    SpatialIndex treeA = new STRtree();
+    SpatialIndex treeB = new STRtree();
+    for (Feature f : fcA.getFeatures()) {
+      treeA.insert(f.getGeometry().getEnvelopeInternal(), f);
+    }
+    for (Feature f : fcB.getFeatures()) {
+      treeB.insert(f.getGeometry().getEnvelopeInternal(), f);
+    }
+
                // -- create the empty dataset with the final FeatureSchema
-               fd = new FeatureDataset(mapping.createSchema("Geometry"));
+               FeatureCollection fd = new 
FeatureDataset(mapping.createSchema("Geometry"));
                // -- add the features and do the attribute mapping
-               for (Iterator iterator = withoutIntersection.iterator(); 
iterator
-                               .hasNext();) {
-                       boolean errorInA = false; boolean errorInB = false;
-                       Geometry geom = (Geometry) iterator.next();
-                       Point pt = geom.getInteriorPoint();
+               int count = 0;
+               List<Integer> errorsInA = new ArrayList<>();
+               List<Integer> errorsInB = new ArrayList<>();
+               for (Geometry geom : withoutIntersection) {
+                       monitor.report(count++, withoutIntersection.size(), 
"polygon");
+                       boolean errorInA = false;
+                       boolean errorInB = false;
+                       Coordinate coord = 
geom.getInteriorPoint().getCoordinate();
+                       Envelope envelope = new Envelope(coord, coord);
                        Feature f = new BasicFeature(fd.getFeatureSchema());
                        Feature featureA = null;
                        Feature featureB = null;
                        // -- query Layer A ---
-                       List candidatesA = 
treeA.query(pt.getEnvelopeInternal());
+                       List<Feature> candidatesA = treeA.query(envelope);
                        int foundCountA = 0;
-                       for (Iterator iterator2 = candidatesA.iterator(); 
iterator2.hasNext();){
-                               Feature ftemp = (Feature) iterator2.next();
-                               if (ftemp.getGeometry().contains(pt)) {
+                       for (Feature ftemp : candidatesA){
+                               if (SimplePointInAreaLocator.locate(coord, 
ftemp.getGeometry()) == Location.INTERIOR) {
                                        foundCountA++;
                                        featureA = ftemp;
                                }
                        }
                        if (foundCountA > 1) {
-                               if (context != null) {
-                                       errorInA = true;
-                                       String errorStrg = 
I18N.get("org.openjump.plugin.tools.IntersectPolygonLayersPlugIn.Found-more-than-one-source-feature-in-Layer");
-                                       
context.getWorkbenchFrame().warnUser(errorStrg+ " " + GenericNames.LAYER_A);
-                           
context.getWorkbenchFrame().getOutputFrame().createNewDocument();
-                           
context.getWorkbenchFrame().getOutputFrame().addText("IntersectPolygonLayersPlugIn:
 " + errorStrg+ ": " + GenericNames.LAYER_A + 
-                                       ". Reason: The Layer contains probably 
objects that overlay each other. Will set polygon values of item with FID: " + 
f.getID() + 
-                                       " to NaN. Use i)" + 
I18N.get("org.openjump.sigle.plugin.SpatialJoinPlugIn.Transfer-Attributes") + 
-                                       " or ii)" + 
I18N.get("org.openjump.core.ui.plugin.tools.JoinAttributesSpatiallyPlugIn.Join-Attributes-Spatially")
 + 
-                                       " functions to obtain atributes from " 
+ GenericNames.LAYER_A);
-                               }
-                       } else if (foundCountA == 0) {
-                               if (context != null) {
-                                       // 
context.getWorkbenchFrame().warnUser("no corresponding
-                                       // feature in Layer A");
-                               }
+                               errorInA = true;
+                               errorsInA.add(f.getID());
                        }
                        // -- query Layer B ---
-                       List candidatesB = 
treeB.query(pt.getEnvelopeInternal());
+                       List<Feature> candidatesB = treeB.query(envelope);
                        int foundCountB = 0;
-                       for (Iterator iterator2 = candidatesB.iterator(); 
iterator2.hasNext();){
-                               Feature ftemp = (Feature) iterator2.next();
-                               if (ftemp.getGeometry().contains(pt)) {
+                       for (Feature ftemp : candidatesB){
+                               if (SimplePointInAreaLocator.locate(coord, 
ftemp.getGeometry()) == Location.INTERIOR) {
                                        foundCountB++;
                                        featureB = ftemp;
                                }
                        }
                        if (foundCountB > 1) {
-                               if (context != null) {
-                                       errorInB = true;
-                                       String errorStrg = 
I18N.get("org.openjump.plugin.tools.IntersectPolygonLayersPlugIn.Found-more-than-one-source-feature-in-Layer");
-                                       
context.getWorkbenchFrame().warnUser(errorStrg+ " " + GenericNames.LAYER_B);
-                           
context.getWorkbenchFrame().getOutputFrame().createNewDocument();
-                           
context.getWorkbenchFrame().getOutputFrame().addText("IntersectPolygonLayersPlugIn:
 " + errorStrg+ ": " + GenericNames.LAYER_B + 
-                                       ". Reason: The Layer contains probably 
objects that overlay each other. Will set polygon values of item with FID: " + 
f.getID() + 
-                                       " to NaN. Use " + 
I18N.get("org.openjump.sigle.plugin.SpatialJoinPlugIn.Transfer-Attributes") + 
-                                       " or " + 
I18N.get("org.openjump.core.ui.plugin.tools.JoinAttributesSpatiallyPlugIn.Join-Attributes-Spatially")
 + 
-                                       " functions to obtain atributes from " 
+ GenericNames.LAYER_B);
-                               }
-                       } else if (foundCountB == 0) {
-                               if (context != null) {
-                                       // 
context.getWorkbenchFrame().warnUser("no corresponding
-                                       // feature in Layer B");
-                               }
+                               errorInB = true;
+                               errorsInB.add(f.getID());
                        }
                        if ((foundCountA > 0) || (foundCountB > 0)){ 
                                // -- before mapping check and set for error 
values
                                if (errorInA){
-                                       featureA = 
resetFeatureValuesToNaN(featureA);
+                                       featureA = 
resetFeatureValuesToNull(featureA);
                                }
                                if (errorInB){
-                                       featureB = 
resetFeatureValuesToNaN(featureB);
+                                       featureB = 
resetFeatureValuesToNull(featureB);
                                }
                                // -- do mapping
                                mapping.transferAttributes(featureA, featureB, 
f);
@@ -316,33 +285,61 @@
                                f.setGeometry((Geometry) geom.clone());
                                fd.add(f);
                        }
-//                     else{
-//                             System.out.println("polygon without 
correspondent"); 
-//                     }
                }
-               // --
+               if (context != null) {
+                       if (errorsInA.size() > 0 || errorsInB.size() > 0) {
+                               String errorStrg = 
I18N.get("org.openjump.plugin.tools.IntersectPolygonLayersPlugIn.Found-more-than-one-source-feature-in-Layer");
+                               String layers = "";
+                               if (errorsInA.size() > 0) {
+                                       layers = layers + " " + 
GenericNames.LAYER_A;
+          context.getWorkbenchFrame().getOutputFrame().createNewDocument();
+                                       
context.getWorkbenchFrame().getOutputFrame().addText(
+                                                                       
"IntersectPolygonLayersPlugIn: " + errorStrg + ": " + GenericNames.LAYER_A + 
"." +
+                                                                       "\n" +
+                                                                       
"Reason: The Layer contains probably objects that overlay each other. Will set 
polygon values of items with FID: " + errorsInA +
+                                                                       " to 
NaN. Use " + 
I18N.get("org.openjump.sigle.plugin.SpatialJoinPlugIn.Transfer-Attributes") +
+                                                                       " or " 
+ 
I18N.get("org.openjump.core.ui.plugin.tools.JoinAttributesSpatiallyPlugIn.Join-Attributes-Spatially")
 +
+                                                                       " 
functions to obtain atributes from " + GenericNames.LAYER_A);
+                               }
+                               if (errorsInB.size() > 0) {
+                                       layers = layers + " " + 
GenericNames.LAYER_B;
+          context.getWorkbenchFrame().getOutputFrame().createNewDocument();
+                                       
context.getWorkbenchFrame().getOutputFrame().addText(
+                                                                       
"IntersectPolygonLayersPlugIn: " + errorStrg + ": " + GenericNames.LAYER_B + 
"." +
+                                                                       "\n" +
+                                                                       
"Reason: The Layer contains probably objects that overlay each other. Will set 
polygon values of items with FID: " + errorsInB +
+                                                                       " to 
NaN. Use " + 
I18N.get("org.openjump.sigle.plugin.SpatialJoinPlugIn.Transfer-Attributes") +
+                                                                       " or " 
+ 
I18N.get("org.openjump.core.ui.plugin.tools.JoinAttributesSpatiallyPlugIn.Join-Attributes-Spatially")
 +
+                                                                       " 
functions to obtain atributes from " + GenericNames.LAYER_B);
+                               }
+                               context.getWorkbenchFrame().warnUser(errorStrg 
+ layers);
+                       }
+               }
                return fd;
        }
        
        /**
         * All values are set to NaN.
-        * @param f
+        * @param f feature to reset
         */
-       public static Feature resetFeatureValuesToNaN(Feature f){
+       static Feature resetFeatureValuesToNull(Feature f){
                //-- work only on a copy so the original feature isn't changed
                Feature ftemp = f.clone(true);
                FeatureSchema fs = ftemp.getSchema();
-               for (int i =0; i < fs.getAttributeCount(); i++){
+               for (int i = 0; i < fs.getAttributeCount(); i++){
                        AttributeType type = fs.getAttributeType(i); 
                        if (!type.equals(AttributeType.GEOMETRY)){
                                if(type.equals(AttributeType.DOUBLE)){
-                                       ftemp.setAttribute(i, Double.NaN);
+                                       ftemp.setAttribute(i, null);
                                }
                                if(type.equals(AttributeType.INTEGER)){
                                        ftemp.setAttribute(i, null);
                                }
+                               if(type.equals(AttributeType.LONG)){
+                                       ftemp.setAttribute(i, null);
+                               }
                                if(type.equals(AttributeType.STRING)){
-                                       ftemp.setAttribute(i, "NaN");
+                                       ftemp.setAttribute(i, null);
                                }
                                if(type.equals(AttributeType.OBJECT)){
                                        ftemp.setAttribute(i, null);
@@ -350,191 +347,28 @@
                                if(type.equals(AttributeType.DATE)){
                                        ftemp.setAttribute(i, null);
                                }
+                               if(type.equals(AttributeType.BOOLEAN)){
+                                       ftemp.setAttribute(i, null);
+                               }
                        }
                }
                return ftemp;
        }
-       
-       /**
-        * Merges/Intersects two polygon layers into one layer. It therefore
-        * calculates all geometric intersections between the polygons. 
Afterwards
-        * the attributes are transferred. The later step assumes that a new 
created
-        * intersection polygon has at max only one correspondent polygon per 
layer.
-        * Note: this approach using the IntersectGeometries() class results in
-        * unwanted spikes during the polygon intersection. The method 
runIntersectionNew()
-        * tries to avoid this by not using the polygon intersection but 
creating polygons
-        * from all lines derived from the polygons and removing some of those.
-        * 
-        * @param fcA
-        * @param fcB
-        * @param accuraccy this parameter has currently no effect (now the 
default fixed precision model is used)
-        * @param transferAttributes should attributes be transfered?
-        * @param monitor can be null
-        * @param context can be null
-        * @return a FeatureCollection that contains the result of the 
intersection
-        *         (i.e. the new created features)
-        */
-       private FeatureCollection runIntersectionOld(FeatureCollection fcA,
-                       FeatureCollection fcB, double accurracy, boolean 
transferAttributes,
-                       TaskMonitor monitor, PlugInContext context) {
-               FeatureCollection fd = null;
-               // -- put all geoms in one list and calculate their 
intersections
-               // i.e. iterate until pure
-               ArrayList<Geometry> geomsToCheck = new ArrayList<Geometry>();
-               for (Iterator iterator = fcA.iterator(); iterator.hasNext();) {
-                       Feature f = (Feature) iterator.next();
-                       geomsToCheck.add(f.getGeometry());
-               }
-               for (Iterator iterator = fcB.iterator(); iterator.hasNext();) {
-                       Feature f = (Feature) iterator.next();
-                       geomsToCheck.add(f.getGeometry());
-               }
-               // -- sort out the different geometry types
-               for (Iterator iterator = geomsToCheck.iterator(); 
iterator.hasNext();) {
-                       Geometry geom = (Geometry) iterator.next();
-                       if ((geom instanceof Polygon) || (geom instanceof 
MultiPolygon)) {
-                               // everything is fine
-                       } else {
-                               // --
-                               if (context != null) {
-                                       context
-                                                       .getWorkbenchFrame()
-                                                       .warnUser(
-                                                                       I18N
-                                                                               
        
.get("org.openjump.plugin.tools.IntersectPolygonLayersPlugIn.Geometry-no-Polygon-or-Multi-Polygon"));
-                               }
-                               // --
-                               return null;
-                       }
-               }
-               ArrayList<Geometry> withoutIntersection = IntersectGeometries
-                               .intersectPolygons(geomsToCheck, accurracy, 
monitor, context);
-               if (transferAttributes == false) {
-                       fd = 
FeatureDatasetFactory.createFromGeometry(withoutIntersection);
-                       return fd;
-               }
-               if (monitor != null) {
-                       monitor.report(this.sTRANSFER);
-               }
-               // ===================== Transfer Attributes ==================
-               // note: if we transfer attributes we need a unique set of
-               // FeatureSchemas
-               // Hence a feature that has a corespondant in only one layer 
should
-               // still
-               // have all attributes from both source layers.
-               // ============================================================
-               // -- put all original objects in trees for faster query
-               SpatialIndex treeA = new STRtree();
-               for (Iterator iterator = fcA.iterator(); iterator.hasNext();) {
-                       Feature f = (Feature) iterator.next();
-                       treeA.insert(f.getGeometry().getEnvelopeInternal(), f);
-               }
-               SpatialIndex treeB = new STRtree();
-               for (Iterator iterator = fcB.iterator(); iterator.hasNext();) {
-                       Feature f = (Feature) iterator.next();
-                       treeB.insert(f.getGeometry().getEnvelopeInternal(), f);
-               }
-               // -- get all intersecting features (usually there should be 
only one
-               // corresponding feature per layer)
-               // to avoid problems with spatial predicates we do the query 
for an
-               // internal point of the result polygons
-               // and apply an point in polygon test
-               AttributeMapping mapping = new 
AttributeMapping(fcA.getFeatureSchema(),
-                               fcB.getFeatureSchema());
-               // -- create the empty dataset with the final FeatureSchema
-               fd = new FeatureDataset(mapping.createSchema("Geometry"));
-               // -- add the features and do the attribute mapping
-               for (Iterator iterator = withoutIntersection.iterator(); 
iterator
-                               .hasNext();) {
-                       Geometry geom = (Geometry) iterator.next();
-                       Point pt = geom.getInteriorPoint();
-                       Feature f = new BasicFeature(fd.getFeatureSchema());
-                       Feature featureA = null;
-                       Feature featureB = null;
-                       // -- query Layer A ---
-                       List candidatesA = 
treeA.query(pt.getEnvelopeInternal());
-                       int foundCountA = 0;
-                       for (Iterator iterator2 = candidatesA.iterator(); 
iterator2
-                                       .hasNext();)
 
-                       {
-                               Feature ftemp = (Feature) iterator2.next();
-                               if (ftemp.getGeometry().contains(pt)) {
-                                       foundCountA++;
-                                       featureA = ftemp;
-                               }
-                       }
-                       if (foundCountA > 1) {
-                               if (context != null) {
-                                       context
-                                                       .getWorkbenchFrame()
-                                                       .warnUser(
-                                                                       I18N
-                                                                               
        
.get("org.openjump.plugin.tools.IntersectPolygonLayersPlugIn.Found-more-than-one-source-feature-in-Layer")
-                                                                               
        + " " + GenericNames.LAYER_A);
-                               }
-                       } else if (foundCountA == 0) {
-                               if (context != null) {
-                                       // 
context.getWorkbenchFrame().warnUser("no corresponding
-                                       // feature in Layer A");
-                               }
-                       }
-                       // -- query Layer B ---
-                       List candidatesB = 
treeB.query(pt.getEnvelopeInternal());
-                       int foundCountB = 0;
-                       for (Iterator iterator2 = candidatesB.iterator(); 
iterator2
-                                       .hasNext();)
 
-                       {
-                               Feature ftemp = (Feature) iterator2.next();
-                               if (ftemp.getGeometry().contains(pt)) {
-                                       foundCountB++;
-                                       featureB = ftemp;
-                               }
-                       }
-                       if (foundCountB > 1) {
-                               if (context != null) {
-                                       context
-                                                       .getWorkbenchFrame()
-                                                       .warnUser(
-                                                                       I18N
-                                                                               
        
.get("org.openjump.plugin.tools.IntersectPolygonLayersPlugIn.Found-more-than-one-source-feature-in-Layer")
-                                                                               
        + " " + GenericNames.LAYER_B);
-                               }
-                       } else if (foundCountB == 0) {
-                               if (context != null) {
-                                       // 
context.getWorkbenchFrame().warnUser("no corresponding
-                                       // feature in Layer B");
-                               }
-                       }
-                       // -- do mapping
-                       mapping.transferAttributes(featureA, featureB, f);
-                       // -- set Geometry
-                       f.setGeometry((Geometry) geom.clone());
-                       fd.add(f);
-               }
-               // --
-               return fd;
-       }
-
        private void setDialogValues(MultiInputDialog dialog, PlugInContext 
context) {
                dialog.setSideBarDescription(sDescription);
-               // Set initial layer values to the first and second layers in 
the layer
-               // list.
+               // Set initial layer values to the first and second layers in 
the layer list.
                // In #initialize we've already checked that the number of 
layers >= 2.
                // [Jon Aquino]
                dialog.addLayerComboBox(LAYER1, layer1, 
context.getLayerManager());
                dialog.addLayerComboBox(LAYER2, layer2, 
context.getLayerManager());
-               //dialog.addDoubleField(sAccurracy, this.accurracy, 7);
-               //dialog.addCheckBox(sTRANSFER, this.transferAtt);
-
        }
 
+
        private void getDialogValues(MultiInputDialog dialog) {
                layer1 = dialog.getLayer(LAYER1);
                layer2 = dialog.getLayer(LAYER2);
-               //this.transferAtt = dialog.getBoolean(sTRANSFER);
-               //this.accurracy = dialog.getDouble(sAccurracy);
        }
 
 }



_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to