|
From: <jum...@li...> - 2015-12-28 21:37:20
|
Revision: 4714
http://sourceforge.net/p/jump-pilot/code/4714
Author: michaudm
Date: 2015-12-28 21:37:17 +0000 (Mon, 28 Dec 2015)
Log Message:
-----------
Improvements in MakeValidOp/MakeValidPlugIn
Modified Paths:
--------------
core/trunk/src/com/vividsolutions/jump/geom/MakeValidOp.java
core/trunk/src/language/jump.properties
core/trunk/src/language/jump_cz.properties
core/trunk/src/language/jump_de.properties
core/trunk/src/language/jump_es.properties
core/trunk/src/language/jump_fi.properties
core/trunk/src/language/jump_fr.properties
core/trunk/src/language/jump_hu.properties
core/trunk/src/language/jump_it.properties
core/trunk/src/language/jump_ja_JP.properties
core/trunk/src/language/jump_ml.properties
core/trunk/src/language/jump_pt.properties
core/trunk/src/language/jump_pt_BR.properties
core/trunk/src/language/jump_ta_IN.properties
core/trunk/src/language/jump_te.properties
core/trunk/src/language/jump_zh_CN.properties
core/trunk/src/language/jump_zh_HK.properties
core/trunk/src/org/openjump/core/ui/plugin/tools/MakeValidPlugIn.java
Modified: core/trunk/src/com/vividsolutions/jump/geom/MakeValidOp.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/geom/MakeValidOp.java 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/com/vividsolutions/jump/geom/MakeValidOp.java 2015-12-28 21:37:17 UTC (rev 4714)
@@ -10,7 +10,7 @@
import com.vividsolutions.jts.noding.NodedSegmentString;
import com.vividsolutions.jts.operation.linemerge.LineMerger;
import com.vividsolutions.jts.operation.polygonize.Polygonizer;
-import visad.data.netcdf.in.Merger;
+import com.vividsolutions.jts.operation.union.UnaryUnionOp;
import java.util.*;
@@ -27,33 +27,51 @@
private static final Coordinate[] EMPTY_COORD_ARRAY = new Coordinate[0];
private static final LinearRing[] EMPTY_RING_ARRAY = new LinearRing[0];
- // If preserveGeomDim is true, geometry components with a dimension lesser than
- // input geometry dimension are ignored (except if input geometry is an heterogeneous
- // GeometryCollection)
- private boolean preserveGeomDim = false;
+ // If preserveGeomDim is true, the geometry dimension returned by MakeValidOp
+ // must be the same as the inputGeometryType (degenerate components of lower
+ // dimension are removed).
+ // If preserveGeomDim is false MakeValidOp will preserve as much coordinates
+ // as possible and may return a geometry of lower dimension or a
+ // GeometryCollection if input geometry or geometry components have not the
+ // required number of points.
+ private boolean preserveGeomDim = true;
// If preserveCoordDim is true, MakeValidOp preserves third and fourth ordinates.
// If preserveCoordDim is false, third dimension is preserved but not fourth one.
- private boolean preserveCoordDim = false;
+ private boolean preserveCoordDim = true;
+ // If preserveDuplicateCoord is true, MakeValidOp will preserve duplicate
+ // coordinates as much as possible. Generally, duplicate coordinates can be
+ // preserved for linear geometries but not for areal geometries (overlay
+ // operations used to repair polygons remove duplicate points).
+ // If preserveDuplicateCoord is false, all duplicated coordinates are removed.
+ private boolean preserveDuplicateCoord = true;
+
public MakeValidOp() {}
- public MakeValidOp preserveGeomDim() {
- this.preserveGeomDim = true;
+
+ public MakeValidOp setPreserveGeomDim(boolean preserveGeomDim) {
+ this.preserveGeomDim = preserveGeomDim;
return this;
}
- public MakeValidOp preserveCoordDim() {
- this.preserveCoordDim = true;
+ public MakeValidOp setPreserveCoordDim(boolean preserveCoordDim) {
+ this.preserveCoordDim = preserveCoordDim;
return this;
}
+ public MakeValidOp setPreserveDuplicateCoord(boolean preserveDuplicateCoord) {
+ this.preserveDuplicateCoord = preserveDuplicateCoord;
+ return this;
+ }
+
+
/**
* Decompose a geometry recursively into simple components.
* @param geometry input geometry
* @param list a list of simple components (Point, LineString or Polygon)
*/
- public static void decompose(Geometry geometry, List<Geometry> list) {
+ private static void decompose(Geometry geometry, List<Geometry> list) {
for (int i = 0 ; i < geometry.getNumGeometries() ; i++) {
Geometry component = geometry.getGeometryN(i);
if (component instanceof GeometryCollection) decompose(component, list);
@@ -66,22 +84,30 @@
/**
* Repair an invalid geometry.
* <br/>
- * WARNING : a simple geometry may result in a multi-geometry and/or includes
- * degenerate geometries (geometries with a lower dimension than the input geometry).
+ * If preserveGeomDim is true, makeValid will remove degenerated geometries from
+ * the result, i.e geometries which dimension is lower than the input geometry
+ * dimension (except for mixed GeometryCollection).
* <br/>
- * It is up to the client to filter degenerate geometries or to explode geometry
- * collections if he needs to.
+ * A multi-geometry will always produce a multi-geometry (eventually empty or made
+ * of a single component).
+ * A simple geometry may produce a multi-geometry (ex. polygon with self-intersection
+ * will generally produce a multi-polygon). In this case, it is up to the client to
+ * explode multi-geometries if he needs to.
* <br/>
- * WARNING : removeDuplicate is not always respected : polygonization will
- * automatically remove duplicate coordniates. Also 4d coordinate may loose
- * their M value after the noding or the polygonization phase.
- * TODO add an option to return a geometry preserving input dimension
+ * If preserveGeomDim is off, it is up to the client to filter degenerate geometries.
+ * <br/>
+ * WARNING : for geometries of dimension 1 (linear), duplicate coordinates are
+ * preserved as much as possible. For geometries of dimension 2 (areal), duplicate
+ * coordinates are generally removed due to the use of overlay operations.
+ * TODO add an option to return a geometry preserving input coordinate dimension
* @param geometry input geometry
* @return
*/
public Geometry makeValid(Geometry geometry) {
+ // Input geometry is exploded into a list of simple components
List<Geometry> list = new ArrayList<Geometry>(geometry.getNumGeometries());
decompose(geometry, list);
+ // Each single component is made valid
List<Geometry> list2 = new ArrayList<Geometry>();
for (Geometry component : list) {
if (component instanceof Point) {
@@ -102,9 +128,22 @@
}
else assert false : "Should never reach here";
}
+ // If preserveGeomDim is true and input geometry is not a GeometryCollection
+ // components with a lower dimension than input geometry are removed
if (preserveGeomDim && !geometry.getClass().getSimpleName().equals("GeometryCollection")) {
list2 = removeLowerDimension(list2, geometry.getDimension());
}
+ // In a MultiPolygon, polygons cannot touch or overlap each other
+ // (adjacent polygons are not merged in the context of a mixed GeometryCollection)
+ if (list2.size() > 1) {
+ boolean multiPolygon = true;
+ for (Geometry geom : list2) {
+ if (geom.getDimension() < 2) multiPolygon = false;
+ }
+ if (multiPolygon) {
+ list2 = unionAdjacentPolygons(list2);
+ }
+ }
if (list2.isEmpty()) {
GeometryFactory factory = geometry.getFactory();
if (geometry instanceof Point) return factory.createPoint((Coordinate)null);
@@ -116,11 +155,25 @@
else if (geometry instanceof MultiPolygon) return factory.createMultiPolygon(new Polygon[0]);
else return factory.createGeometryCollection(new Geometry[0]);
} else {
- //TODO : The case of MultiPolygon with adjacent polygons is not processed !
- return geometry.getFactory().buildGeometry(list2);
+ Geometry result = geometry.getFactory().buildGeometry(list2);
+ // If input geometry was a GeometryCollection and result is a simple geometry
+ // create a multi-geometry made of a single component
+ if (geometry instanceof GeometryCollection && !(result instanceof GeometryCollection)) {
+ if (geometry instanceof MultiPoint && result instanceof Point) {
+ result = geometry.getFactory().createMultiPoint(new Point[]{(Point)result});
+ }
+ else if (geometry instanceof MultiLineString && result instanceof LineString) {
+ result = geometry.getFactory().createMultiLineString(new LineString[]{(LineString) result});
+ }
+ else if (geometry instanceof MultiPolygon && result instanceof Polygon) {
+ result = geometry.getFactory().createMultiPolygon(new Polygon[]{(Polygon) result});
+ }
+ }
+ return result;
}
}
+
// Remove geometries with a dimension less than dimension parameter
private List<Geometry> removeLowerDimension(List<Geometry> geometries, int dimension) {
List<Geometry> list = new ArrayList<Geometry>();
@@ -132,28 +185,46 @@
return list;
}
+ // Union adjacent polygons to make an invalid MultiPolygon valid
+ private List<Geometry> unionAdjacentPolygons(List<Geometry> list) {
+ UnaryUnionOp op = new UnaryUnionOp(list);
+ Geometry result = op.union();
+ if (result.getNumGeometries() < list.size()) {
+ list.clear();
+ for (int i = 0 ; i < result.getNumGeometries() ; i++) {
+ list.add(result.getGeometryN(i));
+ }
+ }
+ return list;
+ }
+
+
// If X or Y is null, return an empty Point
private Point makePointValid(Point point) {
CoordinateSequence sequence = point.getCoordinateSequence();
- // The case where sequence contains more than one point is not
- // processed (it will return an empty point or the input point
- // unchanged)
- if (Double.isNaN(sequence.getOrdinate(0, 0)) || Double.isNaN(sequence.getOrdinate(0, 1))) {
- return point.getFactory().createPoint(DOUBLE_FACTORY.create(0, sequence.getDimension()));
+ GeometryFactory factory = point.getFactory();
+ CoordinateSequenceFactory csFactory = factory.getCoordinateSequenceFactory();
+ if (sequence.size() == 0) {
+ return point;
+ } else if (Double.isNaN(sequence.getOrdinate(0, 0)) || Double.isNaN(sequence.getOrdinate(0, 1))) {
+ return factory.createPoint(csFactory.create(0, sequence.getDimension()));
+ } else if (sequence.size() == 1) {
+ return point;
} else {
- return point;
+ throw new RuntimeException("JTS cannot create a point from a CoordinateSequence containing several points");
}
}
/**
- * Returns a coordinateSequence free of Coordinates with X or Y value, and if desired, free
+ * Returns a coordinateSequence free of Coordinates with X or Y NaN value, and if desired, free
* of duplicated coordinates. makeSequenceValid keeps the original dimension of input sequence.
* @param sequence input sequence of coordinates
- * @param removeDuplicate
- * @param close
+ * @param preserveDuplicateCoord if duplicate coordinates must be preserved
+ * @param close if the sequence must be closed
* @return
*/
- private static CoordinateSequence makeSequenceValid(CoordinateSequence sequence, boolean removeDuplicate, boolean close) {
+ private static CoordinateSequence makeSequenceValid(CoordinateSequence sequence,
+ boolean preserveDuplicateCoord, boolean close) {
int dim = sequence.getDimension();
// we add 1 to the sequence size for the case where we have to close the linear ring
double[] array = new double[(sequence.size()+1) * sequence.getDimension()];
@@ -166,7 +237,7 @@
modified = true;
continue;
}
- if (removeDuplicate && count > 0 && sequence.getCoordinate(i).equals(sequence.getCoordinate(i-1))) {
+ if (!preserveDuplicateCoord && count > 0 && sequence.getCoordinate(i).equals(sequence.getCoordinate(i-1))) {
modified = true;
continue;
}
@@ -210,16 +281,22 @@
*/
private Geometry makeLineStringValid(LineString lineString) {
CoordinateSequence sequence = lineString.getCoordinateSequence();
- CoordinateSequence sequenceWithoutDuplicates = makeSequenceValid(sequence, true, false);
+ CoordinateSequence sequenceWithoutDuplicates = makeSequenceValid(sequence, false, false);
+ GeometryFactory factory = lineString.getFactory();
if (sequenceWithoutDuplicates.size() == 0) {
// no valid point -> empty LineString
- return lineString.getFactory().createLineString(DOUBLE_FACTORY.create(0, sequence.getDimension()));
+ return factory.createLineString(factory.getCoordinateSequenceFactory().create(0, sequence.getDimension()));
} else if (sequenceWithoutDuplicates.size() == 1) {
// a single valid point -> returns a Point
- return lineString.getFactory().createPoint(sequenceWithoutDuplicates);
+ if (preserveGeomDim) {
+ return factory.createLineString(factory.getCoordinateSequenceFactory().create(0, sequence.getDimension()));
+ } else {
+ return factory.createPoint(sequenceWithoutDuplicates);
+ }
+ } else if (preserveDuplicateCoord){
+ return factory.createLineString(makeSequenceValid(sequence, true, false));
} else {
- // we use already calculated sequenceWithoutDuplicates
- return lineString.getFactory().createLineString(sequenceWithoutDuplicates);
+ return factory.createLineString(sequenceWithoutDuplicates);
}
}
@@ -273,7 +350,7 @@
*/
private Geometry makePolygonComponentsValid(Polygon polygon) {
GeometryFactory factory = polygon.getFactory();
- CoordinateSequence outerRingSeq = makeSequenceValid(polygon.getExteriorRing().getCoordinateSequence(), true, true);
+ CoordinateSequence outerRingSeq = makeSequenceValid(polygon.getExteriorRing().getCoordinateSequence(), false, true);
// The validated sequence of the outerRing does not form a valid LinearRing
// -> build valid 0-dim or 1-dim geometry from all the rings
if (outerRingSeq.size() == 0 || outerRingSeq.size() < 4) {
@@ -290,57 +367,26 @@
// Inner rings may be degenerated
else {
List<LinearRing> innerRings = new ArrayList<LinearRing>();
- List<Geometry> degeneracies = new ArrayList<Geometry>();
+ List<Geometry> degeneratedRings = new ArrayList<Geometry>();
for (int i = 0 ; i < polygon.getNumInteriorRing() ; i++) {
- CoordinateSequence seq = makeSequenceValid(polygon.getInteriorRingN(i).getCoordinateSequence(), true, true);
+ CoordinateSequence seq = makeSequenceValid(polygon.getInteriorRingN(i).getCoordinateSequence(), false, true);
if (seq.size() == 0) continue;
- else if (seq.size() == 1) degeneracies.add(factory.createPoint(seq));
- else if (seq.size() < 4) degeneracies.add(factory.createLineString(seq));
+ else if (seq.size() == 1) degeneratedRings.add(factory.createPoint(seq));
+ else if (seq.size() < 4) degeneratedRings.add(factory.createLineString(seq));
else innerRings.add(factory.createLinearRing(seq));
}
Polygon poly = factory.createPolygon(factory.createLinearRing(outerRingSeq),
innerRings.toArray(new LinearRing[innerRings.size()]));
- if (degeneracies.isEmpty()) {
+ if (degeneratedRings.isEmpty()) {
return poly;
}
else {
- degeneracies.add(0, poly);
- return factory.buildGeometry(degeneracies);
+ degeneratedRings.add(0, poly);
+ return factory.buildGeometry(degeneratedRings);
}
}
}
- /**
- * Extract polygonal components from a geometry.
- * <p>The algorithm is recursive and can handle nested GeometryCollection.</p>
- * <p>null and empty geometries are discarded.</p>
- * @param geometry the geometry from which polygonal components wil be extracted
- * @param list the list into which polygonal components will be added.
- */
- protected void extractPolygons(Geometry geometry, List<Polygon> list) {
- for (int i = 0 ; i < geometry.getNumGeometries() ; i++) {
- Geometry g = geometry.getGeometryN(i);
- if (g == null) continue; // null components are discarded
- else if (g.isEmpty()) continue; // empty components are discarded
- else if (g instanceof Polygon) {
- if (!g.isValid()) {
- Geometry repaired = nodePolygon((Polygon)g); // repair invalid invalid polygons
- if (repaired.isValid()) extractPolygons(repaired, list);
- else {
- repaired = g.buffer(0); // second tentative to repair the polygon
- extractPolygons(repaired, list);
- }
- }
- else if (g.getArea() > 0) list.add((Polygon)g); // discard flat polygons
- }
- else if (g instanceof GeometryCollection) {
- extractPolygons(g, list); // recursivity
- }
- else {
- assert false : "should never reach here";
- }
- }
- }
/**
* Computes a valid Geometry from a Polygon which may not be valid
@@ -352,10 +398,11 @@
*/
protected Geometry nodePolygon(Polygon polygon) {
LinearRing exteriorRing = (LinearRing)polygon.getExteriorRing();
- Geometry geom = getMultiPolygonFromLinearRing(exteriorRing);
+ Geometry geom = getArealGeometryFromLinearRing(exteriorRing);
for (int i = 0 ; i < polygon.getNumInteriorRing() ; i++) {
LinearRing interiorRing = (LinearRing)polygon.getInteriorRingN(i);
- geom = geom.difference(getMultiPolygonFromLinearRing(interiorRing));
+ // TODO avoid the use of difference operator
+ geom = geom.difference(getArealGeometryFromLinearRing(interiorRing));
}
return geom;
}
@@ -368,7 +415,7 @@
* </ul>
* This is used to repair auto-intersecting Polygons
*/
- protected Geometry getMultiPolygonFromLinearRing(LinearRing ring) {
+ protected Geometry getArealGeometryFromLinearRing(LinearRing ring) {
if (ring.isSimple()) {
return ring.getFactory().createMultiPolygon(new Polygon[]{
ring.getFactory().createPolygon(ring, EMPTY_RING_ARRAY)
@@ -382,10 +429,54 @@
geoms.addAll(polygonizer.getCutEdges());
geoms.addAll(polygonizer.getDangles());
geoms.addAll(polygonizer.getInvalidRingLines());
+ if (ring.getCoordinateSequence().getDimension() == 4 && preserveCoordDim) {
+ geoms = restoreFourthDimension(ring, geoms);
+ }
return ring.getFactory().buildGeometry(geoms);
}
}
+ private Collection<Geometry> restoreFourthDimension(LinearRing ring, Collection<Geometry> geoms) {
+ CoordinateSequence sequence = ring.getCoordinateSequence();
+ GeometryFactory factory = ring.getFactory();
+ CoordinateSequenceFactory csFactory = factory.getCoordinateSequenceFactory();
+ if (sequence.getDimension() < 4) {
+ return geoms;
+ }
+ Collection<Geometry> result = new ArrayList<Geometry>();
+ Map<Coordinate,Double> map = new HashMap<Coordinate,Double>();
+ for (int i = 0 ; i < sequence.size() ; i++) {
+ map.put(sequence.getCoordinate(i), sequence.getOrdinate(i, 3));
+ }
+ for (Geometry geom : geoms) {
+ if (geom instanceof Point) {
+ result.add(factory.createPoint(restoreFourthDimension(
+ ((Point) geom).getCoordinateSequence().toCoordinateArray(), map)));
+ }
+ else if (geom instanceof LineString) {
+ result.add(factory.createLineString(restoreFourthDimension(
+ ((LineString) geom).getCoordinateSequence().toCoordinateArray(), map)));
+ }
+ if (geom instanceof Polygon) {
+ result.add(factory.createPolygon(restoreFourthDimension(
+ ((Polygon) geom).getExteriorRing().getCoordinateSequence().toCoordinateArray(), map)));
+ }
+ }
+ return result;
+ }
+
+ CoordinateSequence restoreFourthDimension(Coordinate[] array, Map<Coordinate,Double> map) {
+ CoordinateSequence seq = new PackedCoordinateSequenceFactory(DOUBLE, 4).create(array.length, 4);
+ for (int i = 0 ; i < array.length ; i++) {
+ seq.setOrdinate(i,0,array[i].x);
+ seq.setOrdinate(i,1,array[i].y);
+ seq.setOrdinate(i,2,array[i].z);
+ Double d = map.get(array[i]);
+ seq.setOrdinate(i,3,d==null?Double.NaN:d);
+ }
+ return seq;
+ }
+
/**
* Nodes a LineString and returns a List of Noded LineString's.
* Used to repare auto-intersecting LineString and Polygons.
@@ -431,30 +522,42 @@
public static void main(String[] args) throws ParseException {
GeometryFactory factory = new GeometryFactory();
+ WKTReader reader = new WKTReader();
MakeValidOp op = new MakeValidOp();
- MakeValidOp opClean = new MakeValidOp().preserveGeomDim();
+ MakeValidOp opGeomDimNotPreserved = new MakeValidOp().setPreserveGeomDim(false);
+ MakeValidOp opDupCoordNotPreserved = new MakeValidOp().setPreserveDuplicateCoord(false);
+ MakeValidOp opCoordDimNotPreserved = new MakeValidOp().setPreserveCoordDim(false);
Geometry input, result;
- // check makePointValid
+ // -----------------------------------------------------
+ // Test Point
+ // -----------------------------------------------------
Point p1 = factory.createPoint(new Coordinate(0,0));
Point p2 = op.makePointValid(p1);
assert p1.equals(p2);
+ // return an empty point if X or Y is NaN
p1 = factory.createPoint(new Coordinate(Double.NaN,0));
p2 = op.makePointValid(p1);
assert !p1.isEmpty();
assert p2.isEmpty();
+ // return an empty point if X or Y is NaN
p1 = factory.createPoint(new Coordinate(0, Double.NaN));
p2 = op.makePointValid(p1);
assert !p1.isEmpty();
assert p2.isEmpty();
+ // Preserve fourth coord dimension
p1 = factory.createPoint(DOUBLE_FACTORY.create(new double[]{0,1,2,3}, 4));
p2 = op.makePointValid(p1);
assert p1.getCoordinateSequence().getOrdinate(0,3) == p2.getCoordinateSequence().getOrdinate(0,3);
- // check makeSequenceValid
+
+
+ // -----------------------------------------------------
+ // Test CoordinateSequence
+ // -----------------------------------------------------
CoordinateSequence cs1 = DOUBLE_FACTORY.create(new double[]{0,1,2,3,4,5,6,7}, 4);
CoordinateSequence cs2 = makeSequenceValid(cs1, false, false);
assert cs1.getOrdinate(1,3) == cs2.getOrdinate(1,3);
@@ -474,6 +577,11 @@
cs1 = DOUBLE_FACTORY.create(new double[]{0,1,2,3,0,1,6,7}, 4);
cs2 = makeSequenceValid(cs1, true, false);
+ assert cs2.size() == 2;
+ assert cs2.getOrdinate(0,3) == 3;
+
+ cs1 = DOUBLE_FACTORY.create(new double[]{0,1,2,3,0,1,6,7}, 4);
+ cs2 = makeSequenceValid(cs1, false, false);
assert cs2.size() == 1;
assert cs2.getOrdinate(0,3) == 3;
@@ -494,40 +602,72 @@
assert cs2.getOrdinate(3,2) == 2 : cs2.getOrdinate(3,2);
assert cs2.getOrdinate(3,3) == 3 : cs2.getOrdinate(3,3);
- WKTReader reader = new WKTReader();
+
+ // -----------------------------------------------------
+ // Test LineString
+ // -----------------------------------------------------
+ reader = new WKTReader();
+ input = reader.read("LINESTRING(0 0, 10 0, 20 0, 20 0, 30 0)");
+ assert input.getNumPoints() == 5;
+ // preserve duplicate point
+ result = op.makeValid(input);
+ assert result.getNumPoints() == 5;
+ // do not preserve duplicate point
+ result = opDupCoordNotPreserved.makeValid(input);
+ assert result.getNumPoints() == 4;
+
+ cs1 = DOUBLE_FACTORY.create(new double[]{0,0,2,3, 10,0,4,5, 20,0,6,7}, 4);
+ input = new GeometryFactory(new PackedCoordinateSequenceFactory(DOUBLE, 4)).createLineString(cs1);
+ // preserve 4th coordinate dimension
+ result = op.makeValid(input);
+ assert ((LineString)result).getCoordinateSequence().getOrdinate(1,3) == 5;
+ // do not preserve 4th coordinate dimension (actually, coord dim is preserved in the case of LineString)
+ result = opCoordDimNotPreserved.makeValid(input);
+ assert ((LineString)result).getCoordinateSequence().getDimension() == 4;
+
+
+ input = reader.read("LINESTRING(0 0, 20 0, 20 20, 20 20, 10 -10)");
+ assert input.getNumPoints() == 5;
+ Set<LineString> set = op.nodeLineString(input.getCoordinates(), input.getFactory());
+ assert set.size() == 3; // node + merge -> 3 line strings
+
+ // -----------------------------------------------------
+ // Test Polygon
+ // -----------------------------------------------------
+
// invalid polygon (single linearRing drawing 2 triangles joined by a line)
input = reader.read("POLYGON (( 322 354, 322 348, 325 351, 328 351, 331 348, 331 354, 328 351, 325 351, 322 354 ))");
result = op.makeValid(input);
+ assert result.getNumGeometries() == 2;
+ result = opGeomDimNotPreserved.makeValid(input);
assert result.getNumGeometries() == 3;
- result = opClean.makeValid(input);
- assert result.getNumGeometries() == 2;
- reader = new WKTReader();
// invalid polygon (single linearRing drawing 2 triangles joined by a line, first triangle has duplicated segments)
input = reader.read("POLYGON (( 322 354, 322 348, 322 354, 322 348, 325 351, 328 351, 331 348, 331 354, 328 351, 325 351, 322 354 ))");
result = op.makeValid(input);
+ assert result.getNumGeometries() == 2;
+ result = opGeomDimNotPreserved.makeValid(input);
assert result.getNumGeometries() == 3;
- result = opClean.makeValid(input);
+
+ // restore fourth dimension (self-intersection)
+ cs1 = DOUBLE_FACTORY.create(new double[]{0,0,0,5, 10,0,0,1, 0,10,0,2, 10,10,0,3, 0,0,0,5}, 4);
+ input = factory.createPolygon(cs1);
+ assert input.getNumGeometries() == 1;
+ result = op.makeValid(input);
assert result.getNumGeometries() == 2;
+ assert ((Polygon)result.getGeometryN(0)).getExteriorRing().getCoordinateSequence().getDimension() == 4;
+ assert ((Polygon)result.getGeometryN(0)).getExteriorRing().getCoordinateSequence().getOrdinate(1,3) > 0;
+ result = opCoordDimNotPreserved.makeValid(input);
+ assert result.getNumGeometries() == 2;
+ assert ((Polygon)result.getGeometryN(0)).getExteriorRing().getCoordinateSequence().getDimension() == 3;
+ // -----------------------------------------------------
+ // Test MultiPolygon
+ // -----------------------------------------------------
+ input = reader.read("MULTIPOLYGON (((0 0, 10 0, 10 10, 0 10, 0 0)), ((10 0, 20 0, 20 10, 10 10, 10 0)))");
+ assert input.getNumGeometries() == 2;
+ result = op.makeValid(input);
+ assert result.getNumGeometries() == 1;
-
- reader = new WKTReader();
- input = reader.read("LINESTRING(0 0, 10 0, 20 0, 20 0, 30 0)");
- assert input.getNumPoints() == 5;
- Set<LineString> set = op.nodeLineString(input.getCoordinates(), input.getFactory());
- assert set.size() == 1;
- assert set.iterator().next().getCoordinates().length == 4; // removed duplicate coordinate
-
- input = reader.read("LINESTRING(0 0, 20 0, 20 20, 20 20, 10 -10)");
- assert input.getNumPoints() == 5;
- set = op.nodeLineString(input.getCoordinates(), input.getFactory());
- assert set.size() == 3; // node + merge -> 3 line strings
-
- Polygonizer polygonizer = new Polygonizer();
- polygonizer.add(set);
- Collection<Polygon> polys = polygonizer.getPolygons();
- System.out.println(polys);
-
}
}
Modified: core/trunk/src/language/jump.properties
===================================================================
--- core/trunk/src/language/jump.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -1368,11 +1368,16 @@
org.openjump.core.ui.plugin.tools.LineSimplifyJTS15AlgorithmPlugIn.simplification-finalized = simplification finalized
org.openjump.core.ui.plugin.tools.MakeValidPlugIn = Make Valid
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.source-layer = Layer
-org.openjump.core.ui.plugin.tools.MakeValidPlugIn.description = Repair invalid geometries and remove duplicate coordinates.\n\
-Select options to decompose multi-geometries into several features or to eliminate degenerate parts (parts with a lower dimension than original geometry).
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.description = Repair invalid geometries.\n\
+Select options to preserve initial dimension (by removing degenerated components) or to decompose multi-geometries into several features.
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi = Explode multi-geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip = Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim = Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip = Eliminate degenerated components to preserve geometry dimension
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.result-layer-suffix = valid
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-degenerate-parts = Remove degenerate parts
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord = Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip = Remove duplicate coordinates
org.openjump.core.ui.plugin.tools.MeasureM_FPlugIn.Error-see-output-window = Error\: see output window
org.openjump.core.ui.plugin.tools.MeasureM_FPlugIn.Measure-In-Feets = Measure In Feet
org.openjump.core.ui.plugin.tools.MeasureM_FTool.Distance = Distance
Modified: core/trunk/src/language/jump_cz.properties
===================================================================
--- core/trunk/src/language/jump_cz.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_cz.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2572,3 +2572,8 @@
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=Nepodporovan\u00FD typ dotazu
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=V\u00FDsledn\u00E1 sada mus\u00ED m\u00EDt sloupec s geometri\u00ED
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=\#T\:SQL error\:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_de.properties
===================================================================
--- core/trunk/src/language/jump_de.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_de.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2568,3 +2568,8 @@
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=Nicht unterst\u00fctze Abfrage-Typ
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=Ergebnisdaten m\u00fcssen ein Geometrie-Attribut haben
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=\#T\:SQL error\:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_es.properties
===================================================================
--- core/trunk/src/language/jump_es.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_es.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2548,4 +2548,9 @@
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=Tipo de consulta no soportado
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=El conjunto de resultados debe tener una Columna Geometr\u00eda
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=\#T\:SQL error\:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_fi.properties
===================================================================
--- core/trunk/src/language/jump_fi.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_fi.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2545,3 +2545,8 @@
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=Kyselytyyppi ei ole tuettu
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=Geometriakentt\u00e4 on oltava mukana tuloksessa.
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=\#T\:SQL error\:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_fr.properties
===================================================================
--- core/trunk/src/language/jump_fr.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_fr.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2566,8 +2566,8 @@
org.openjump.core.ui.plugin.tools.EraseLayerAWithLayerBPlugIn=D\u00e9couper une couche par une autre
org.openjump.core.ui.plugin.tools.MakeValidPlugIn=R\u00e9parer les g\u00e9om\u00e9tries invalides
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.source-layer=Couche
-org.openjump.core.ui.plugin.tools.MakeValidPlugIn.description=R\u00e9parer des g\u00e9om\u00e9tries invalides et supprimer les points redondants.\n\
-Utiliser les options pour d\u00e9composer les multi-geom\u00e9tries r\u00e9sultantes en plusieurs objets ou pour \u00e9liminer les parties d\u00e9g\u00e9n\u00e9r\u00e9es (de dimension inf\u00e9rieure \u00e0 la g\u00e9om\u00e9rie originale).
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.description=R\u00e9parer des g\u00e9om\u00e9tries invalides.\n\
+Utiliser les options pour pr\xE9server la dimension de la g\xE9om\xE9trie originale ou pour d\u00e9composer les multi-geom\u00e9tries r\u00e9sultantes en plusieurs objets.
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi=D\u00e9composer les multi-g\u00e9om\u00e9tries
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.result-layer-suffix=valide
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-degenerate-parts=Supprimer les parties d\u00e9g\u00e9n\u00e9r\u00e9es
@@ -2575,3 +2575,8 @@
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=Type de requ\u00eate non support\u00e9
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=Aucune colonne g\u00e9om\u00e9trique trouv\u00e9e
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=Erreur SQL:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=D\xE9compose les g\xE9om\xE9tries multiples en g\xE9om\xE9tries simples
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=Pr\xE9server la dimension de la g\xE9om\xE9trie d'origine
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=Elimine les \xE9l\xE9ments de dimension inf\xE9rieure \xE0 la g\xE9om\xE9trie d'origine
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=Supprimer les points doubles
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=Supprimer les points doubles
Modified: core/trunk/src/language/jump_hu.properties
===================================================================
--- core/trunk/src/language/jump_hu.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_hu.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2566,4 +2566,9 @@
org.openjump.core.ui.plugin.tools.CutFeaturesTool.geometry-collections-have-not-been-cut=\#T\:GeometryCollections have not been cut
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=Nem t\u00e1mogatott lek\u00e9rdez\u00e9s t\u00edpus
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=Az eredm\u00e9nyben Geometria oszlopnak kell lennie
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_it.properties
===================================================================
--- core/trunk/src/language/jump_it.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_it.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2549,3 +2549,8 @@
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=Interrogazione di tipo non supportata
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=Il set di risultati devono avere una Colonna Geometria
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=\#T\:SQL error\:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_ja_JP.properties
===================================================================
--- core/trunk/src/language/jump_ja_JP.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_ja_JP.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2568,4 +2568,9 @@
org.openjump.core.ui.plugin.tools.CutFeaturesTool.geometry-collections-have-not-been-cut=\#T\:GeometryCollections have not been cut
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=#T:Unsupported Query Type
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=#T:Result Set Must Have a Geometry Column
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_ml.properties
===================================================================
--- core/trunk/src/language/jump_ml.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_ml.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -3839,4 +3839,9 @@
org.openjump.core.ui.plugin.tools.CutFeaturesTool.geometry-collections-have-not-been-cut=\#T\:GeometryCollections have not been cut
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=#T:Unsupported Query Type
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=\#T\:Result Set Must Have a Geometry Column
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_pt.properties
===================================================================
--- core/trunk/src/language/jump_pt.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_pt.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2566,3 +2566,8 @@
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=#T:Unsupported Query Type
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=#T:Result Set Must Have a Geometry Column
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=\#T\:SQL error\:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_pt_BR.properties
===================================================================
--- core/trunk/src/language/jump_pt_BR.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_pt_BR.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2565,4 +2565,9 @@
org.openjump.core.ui.plugin.tools.CutFeaturesTool.geometry-collections-have-not-been-cut=\#T\:GeometryCollections have not been cut
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=#T:Unsupported Query Type
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=#T:Result Set Must Have a Geometry Column
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_ta_IN.properties
===================================================================
--- core/trunk/src/language/jump_ta_IN.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_ta_IN.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2564,4 +2564,9 @@
org.openjump.core.ui.plugin.tools.CutFeaturesTool.geometry-collections-have-not-been-cut=\#T\:GeometryCollections have not been cut
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=#T:Unsupported Query Type
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=#T:Result Set Must Have a Geometry Column
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_te.properties
===================================================================
--- core/trunk/src/language/jump_te.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_te.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -3073,4 +3073,9 @@
org.openjump.core.ui.plugin.tools.CutFeaturesTool.geometry-collections-have-not-been-cut=\#T\:GeometryCollections have not been cut
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=#T:Unsupported Query Type
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=#T:Result Set Must Have a Geometry Column
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_zh_CN.properties
===================================================================
--- core/trunk/src/language/jump_zh_CN.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_zh_CN.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2728,4 +2728,9 @@
org.openjump.core.ui.plugin.tools.CutFeaturesTool.geometry-collections-have-not-been-cut=\#T\:GeometryCollections have not been cut
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=#T:Unsupported Query Type
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=#T:Result Set Must Have a Geometry Column
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/language/jump_zh_HK.properties
===================================================================
--- core/trunk/src/language/jump_zh_HK.properties 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/language/jump_zh_HK.properties 2015-12-28 21:37:17 UTC (rev 4714)
@@ -2727,4 +2727,9 @@
org.openjump.core.ui.plugin.tools.CutFeaturesTool.geometry-collections-have-not-been-cut=\#T\:GeometryCollections have not been cut
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.unsupported-query-type=#T:Unsupported Query Type
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.resultset-must-have-a-geometry-column=#T:Result Set Must Have a Geometry Column
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL error:
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose multi-geometries into simple geometries
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate degenerated components to preserve geometry dimension
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove duplicate coordinates
+org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove duplicate coordinates
Modified: core/trunk/src/org/openjump/core/ui/plugin/tools/MakeValidPlugIn.java
===================================================================
--- core/trunk/src/org/openjump/core/ui/plugin/tools/MakeValidPlugIn.java 2015-12-28 19:07:33 UTC (rev 4713)
+++ core/trunk/src/org/openjump/core/ui/plugin/tools/MakeValidPlugIn.java 2015-12-28 21:37:17 UTC (rev 4714)
@@ -24,21 +24,39 @@
/**
- * Created by UMichael on 05/12/2015.
+ * A plugIn to repair invalid geometries
*/
public class MakeValidPlugIn extends AbstractThreadedUiPlugIn {
public static String SOURCE_LAYER = I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.source-layer");
public static String DESCRIPTION = I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.description");
- //public static String REMOVE_DUPLICATES = I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicates");
- public static String DECOMPOSE_MULTI = I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi");
public static String RESULT_LAYER_SUFFIX = I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.result-layer-suffix");
- public static String REMOVE_DEGENERATE_PARTS = I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-degenerate-parts");
+ public static String PRESERVE_GEOM_DIM =
+ I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim");
+ public static String PRESERVE_GEOM_DIM_TOOLTIP =
+ I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip");
+
+ //public static String PRESERVE_COORD_DIM =
+ // I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-coord-dim");
+ //public static String PRESERVE_COORD_DIM_TOOLTIP =
+ // I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-coord-dim-tooltip");
+
+ public static String REMOVE_DUPLICATE_COORD =
+ I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord");
+ public static String REMOVE_DUPLICATE_COORD_TOOLTIP =
+ I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip");
+
+ public static String DECOMPOSE_MULTI
+ = I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi");
+ public static String DECOMPOSE_MULTI_TOOLTIP
+ = I18N.get("org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip");
+
private Layer layerA;
- //private boolean removeDuplicates;
- private boolean decomposeMulti;
- private boolean removeDegenerateParts;
+ private boolean preserveGeomDim = true;
+ //private boolean preserveCoordDim = true;
+ private boolean removeDuplicateCoord = true;
+ private boolean decomposeMulti = false;
public MakeValidPlugIn() {
}
@@ -81,20 +99,24 @@
Layer candidateA = layerA == null ? context.getCandidateLayer(0) : layerA;
final JComboBox layerComboBoxA =
dialog.addLayerComboBox(SOURCE_LAYER, candidateA, context.getLayerManager());
- //final JCheckBox removeDuplicatesCB = dialog.addCheckBox(REMOVE_DUPLICATES, removeDuplicates, REMOVE_DUPLICATES);
- final JCheckBox decomposeMultiCB =
- dialog.addCheckBox(DECOMPOSE_MULTI, decomposeMulti, DECOMPOSE_MULTI);
- final JCheckBox removeDegeneratePartsCB =
- dialog.addCheckBox(REMOVE_DEGENERATE_PARTS, removeDegenerateParts, REMOVE_DEGENERATE_PARTS);
+ final JCheckBox preserveGeomDimCB =
+ dialog.addCheckBox(PRESERVE_GEOM_DIM, preserveGeomDim, PRESERVE_GEOM_DIM_TOOLTIP);
+ //final JCheckBox preserveCoordDimCB =
+ // dialog.addCheckBox(PRESERVE_COORD_DIM, preserveCoordDim, PRESERVE_COORD_DIM_TOOLTIP);
+ final JCheckBox removeDuplicateCoordCB =
+ dialog.addCheckBox(REMOVE_DUPLICATE_COORD, removeDuplicateCoord, REMOVE_DUPLICATE_COORD);
+ final JCheckBox decomposeMultiCB =
+ dialog.addCheckBox(DECOMPOSE_MULTI, decomposeMulti, DECOMPOSE_MULTI_TOOLTIP);
GUIUtil.centreOnWindow(dialog);
}
private void getDialogValues(MultiInputDialog dialog) {
layerA = dialog.getLayer(SOURCE_LAYER);
- //removeDuplicates = dialog.getBoolean(REMOVE_DUPLICATES);
+ preserveGeomDim = dialog.getBoolean(PRESERVE_GEOM_DIM);
+ //preserveCoordDim = dialog.getBoolean(PRESERVE_COORD_DIM);
+ removeDuplicateCoord = dialog.getBoolean(REMOVE_DUPLICATE_COORD);
decomposeMulti = dialog.getBoolean(DECOMPOSE_MULTI);
- removeDegenerateParts = dialog.getBoolean(REMOVE_DEGENERATE_PARTS);
}
public void run(TaskMonitor monitor, PlugInContext context) throws Exception {
@@ -106,10 +128,12 @@
result1.add(((Feature)o).clone(true, true));
}
MakeValidOp makeValidOp = new MakeValidOp();
+ makeValidOp.setPreserveGeomDim(preserveGeomDim);
+ //makeValidOp.setPreserveCoordDim(preserveCoordDim);
+ makeValidOp.setPreserveDuplicateCoord(!removeDuplicateCoord);
for (Object o : result1.getFeatures()) {
Feature feature = (Feature)o;
- Geometry validGeom = new MakeValidOp().makeValid(feature.getGeometry());
- if (removeDegenerateParts) validGeom = removeDegenerateParts(feature.getGeometry(), validGeom);
+ Geometry validGeom = makeValidOp.makeValid(feature.getGeometry());
feature.setGeometry(validGeom);
}
if (decomposeMulti) {
@@ -136,16 +160,4 @@
...
[truncated message content] |