/** * Decimate a geometry (reducing the number of vertices) for incoming buffering * * @param geometry * @return */ public static Geometry decimate(Geometry geometry) { Coordinate[] coordinates = geometry.getCoordinates(); if (coordinates.length <= Utils.COORDS_DECIMATION_THRESHOLD) { return geometry; } Geometry g2 = LiteCoordinateSequence.cloneGeometry(geometry, 2); Decimator decimator = new Decimator( DEFAULT_LINESTRING_DECIMATION_SPAN, DEFAULT_LINESTRING_DECIMATION_SPAN); decimator.decimate(g2); g2.geometryChanged(); return g2; }
/** * Builds a decimator that will generalize geometries so that two subsequent points will be at * least pixelDistance away from each other when painted on the screen. Set pixelDistance to 0 * if you don't want any generalization (but just a transformation) * * @param screenToWorld * @param paintArea * @param pixelDistance */ public Decimator(MathTransform screenToWorld, Rectangle paintArea, double pixelDistance) { if (screenToWorld != null && pixelDistance > 0) { try { double[] spans = computeGeneralizationDistances(screenToWorld, paintArea, pixelDistance); this.spanx = spans[0]; this.spany = spans[1]; } catch (TransformException e) { throw new RuntimeException( "Could not perform the generalization spans computation", e); } } else { this.spanx = 1; this.spany = 1; } }
@Test public void testDistance() throws Exception { LineString ls = gf.createLineString(csf.create(new double[] {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5})); Decimator d = new Decimator(identity, new Rectangle(0, 0, 5, 5), 0.8); d.decimateTransformGeneralize((Geometry) ls.copy(), identity); assertEquals(6, ls.getNumPoints()); d = new Decimator(identity, new Rectangle(0, 0, 5, 5), 1); d.decimateTransformGeneralize(ls, identity); assertEquals(4, ls.getNumPoints()); d = new Decimator(identity, new Rectangle(0, 0, 5, 5), 6); d.decimateTransformGeneralize(ls, identity); assertEquals(2, ls.getNumPoints()); }
diffy = Math.abs(prevy - curry); if (diffx > spanx || diffy > spany) { readDoubles = copyCoordinate(coords, dim, readDoubles, currentDoubles); readDoubles = copyCoordinate(coords, dim, readDoubles, currentDoubles); decimateRingFully(seq); } else { if (readDoubles < numDoubles) {
final int numGeometries = collection.getNumGeometries(); for (int i = 0; i < numGeometries; i++) { decimate(collection.getGeometryN(i)); if (decimateOnEnvelope(line, seq)) { return; decimate(line, seq); } else if (geom instanceof Polygon) { Polygon line = (Polygon) geom; decimate(line.getExteriorRing()); final int numRings = line.getNumInteriorRing(); for (int i = 0; i < numRings; i++) { decimate(line.getInteriorRingN(i));
/** @throws org.opengis.referencing.operation.NoninvertibleTransformException */ private Decimator getDecimator(MathTransform mathTransform) { // returns a decimator that does nothing if the currently set generalization // distance is zero (no generalization desired) or if the datastore has // already done full generalization at the desired level if (generalizationDistance == 0 || !inMemoryGeneralization) return NULL_DECIMATOR; Decimator decimator = (Decimator) decimators.get(mathTransform); if (decimator == null) { try { if (mathTransform != null && !mathTransform.isIdentity()) decimator = new Decimator( mathTransform.inverse(), screenSize, generalizationDistance); else decimator = new Decimator(null, screenSize, generalizationDistance); } catch (org.opengis.referencing.operation.NoninvertibleTransformException e) { decimator = new Decimator(null, screenSize, generalizationDistance); } decimators.put(mathTransform, decimator); } return decimator; } }
if (decimator != null) { this.geometry = decimator.decimateTransformGeneralize(this.geometry, this.mathTransform); this.geometry.geometryChanged(); } else { && generalize && geometry != null) { new Decimator(mathTransform.inverse()).decimate(this.geometry); this.geometry.geometryChanged();
for (int i = 0; i < length; i++) { Geometry source = collection.getGeometryN(i); Geometry generalized = decimateTransformGeneralize(source, transform); Geometry element = collection.getGeometryN(j); elements[j] = element; accumulateGeometryType(elementType, element); elementType = accumulateGeometryType(elementType, generalized); LiteCoordinateSequence seq = (LiteCoordinateSequence) ((Point) geometry).getCoordinateSequence(); decimateTransformGeneralize(seq, transform, false, spanx, spany); return geometry; } else if (geometry instanceof Polygon) { Polygon polygon = (Polygon) geometry; LinearRing shell = (LinearRing) decimateTransformGeneralize(polygon.getExteriorRing(), transform); boolean cloned = shell != polygon.getExteriorRing(); final int length = polygon.getNumInteriorRing(); for (int i = 0; i < length; i++) { LineString hole = polygon.getInteriorRingN(i); LinearRing generalized = (LinearRing) decimateTransformGeneralize(hole, transform); cloned |= generalized != hole; if (cloned) { decimateTransformGeneralize(seq, transform, loop, spanx, spany); if (seq != originalSequence) {
public final void decimateTransformGeneralize(Geometry geometry, MathTransform transform) throws TransformException { if (geometry instanceof GeometryCollection) { GeometryCollection collection = (GeometryCollection) geometry; final int length = collection.getNumGeometries(); for (int i = 0; i < length; i++) { decimateTransformGeneralize(collection.getGeometryN(i), transform); } } else if (geometry instanceof Point) { LiteCoordinateSequence seq = (LiteCoordinateSequence) ((Point) geometry) .getCoordinateSequence(); decimateTransformGeneralize(seq, transform); } else if (geometry instanceof Polygon) { Polygon polygon = (Polygon) geometry; decimateTransformGeneralize(polygon.getExteriorRing(), transform); final int length = polygon.getNumInteriorRing(); for (int i = 0; i < length; i++) { decimateTransformGeneralize(polygon.getInteriorRingN(i), transform); } } else if (geometry instanceof LineString) { LiteCoordinateSequence seq = (LiteCoordinateSequence) ((LineString) geometry) .getCoordinateSequence(); decimateTransformGeneralize(seq, transform); } }
Decimator nullDecimator = new Decimator(-1, -1); GeometryFactory geomFactory = new GeometryFactory(); Coordinate stippleCoord1 = new Coordinate(0, 0);
decimator.decimateTransformGeneralize(this.geometry,this.mathTransform); } else { new Decimator(mathTransform.inverse()).decimate(this.geometry); if (geometry != null) transformGeometry(geometry);
final int numGeometries = collection.getNumGeometries(); for (int i = 0; i < numGeometries; i++) { decimate(collection.getGeometryN(i)); LiteCoordinateSequence seq = (LiteCoordinateSequence) line .getCoordinateSequence(); if (decimateOnEnvelope(line, seq)) { return; decimate(line, seq); } else if (geom instanceof Polygon) { Polygon line = (Polygon) geom; decimate(line.getExteriorRing()); final int numRings = line.getNumInteriorRing(); for (int i = 0; i < numRings; i++) { decimate(line.getInteriorRingN(i));
diffy = Math.abs(prevy - curry); if (diffx > spanx || diffy > spany) { readDoubles = copyCoordinate(coords, dim, readDoubles, currentDoubles); readDoubles = copyCoordinate(coords, dim, readDoubles, currentDoubles); decimateRingFully(seq); } else { if(readDoubles < numDoubles) {
final int length = collection.getNumGeometries(); for (int i = 0; i < length; i++) { decimateTransformGeneralize(collection.getGeometryN(i), transform); LiteCoordinateSequence seq = (LiteCoordinateSequence) ((Point) geometry) .getCoordinateSequence(); decimateTransformGeneralize(seq, transform, false); } else if (geometry instanceof Polygon) { Polygon polygon = (Polygon) geometry; decimateTransformGeneralize(polygon.getExteriorRing(), transform); final int length = polygon.getNumInteriorRing(); for (int i = 0; i < length; i++) { decimateTransformGeneralize(polygon.getInteriorRingN(i), transform); Math.abs(y0 - y1) < EPS; decimateTransformGeneralize(seq, transform, loop);
/** http://jira.codehaus.org/browse/GEOT-2937 */ @Test public void testDecimatePseudoRing() { // a long rectangle made of 3 coordinates LineString g = gf.createLineString(csf.create(new double[] {0, 0, 0, 10, 0, 0})); assertTrue(g.isValid()); Decimator d = new Decimator(4, 4); d.decimate(g); g.geometryChanged(); assertTrue(g.isValid()); assertEquals(3, g.getCoordinateSequence().size()); }
Decimator nullDecimator = new Decimator(-1, -1);
@Test public void testDecimate3DPoint() throws Exception { Point p = gf.createPoint(csf.create(new double[] {0, 1, 2}, 3)); Decimator d = new Decimator(identity, new Rectangle(0, 0, 5, 5), 0.8); d.decimateTransformGeneralize(p, identity); assertEquals(1, p.getNumPoints()); assertEquals(2, p.getCoordinateSequence().getDimension()); }
decimator.decimateTransformGeneralize(this.geometry,this.mathTransform); this.geometry.geometryChanged(); } else { new Decimator(mathTransform.inverse()).decimate(this.geometry); this.geometry.geometryChanged();
double[] dx = Decimator.computeGeneralizationDistances(mt, new Rectangle(10, 10), 1); assertEquals(10, dx[0], 0d); assertEquals(10, dx[1], 0d);
final int numGeometries = collection.getNumGeometries(); for (int i = 0; i < numGeometries; i++) { decimate(collection.getGeometryN(i)); LiteCoordinateSequence seq = (LiteCoordinateSequence) line .getCoordinateSequence(); if (decimateOnEnvelope(line, seq)) { return; decimate(line, seq); } else if (geom instanceof Polygon) { Polygon line = (Polygon) geom; decimate(line.getExteriorRing()); final int numRings = line.getNumInteriorRing(); for (int i = 0; i < numRings; i++) { decimate(line.getInteriorRingN(i));