/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.h2gis.functions.spatial.edit; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.LinearRing; import com.vividsolutions.jts.geom.MultiLineString; import com.vividsolutions.jts.geom.MultiPoint; import com.vividsolutions.jts.geom.MultiPolygon; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Polygon; import java.util.ArrayList; import org.h2gis.api.DeterministicScalarFunction; import org.h2gis.utilities.jts_utils.CoordinateUtils; /** * * @author Erwan Bocher */ public class ST_RemoveDuplicatedCoordinates extends DeterministicScalarFunction { private static final GeometryFactory FACTORY = new GeometryFactory(); public ST_RemoveDuplicatedCoordinates() { addProperty(PROP_REMARKS, "Returns a version of the given geometry without duplicated coordinates."); } @Override public String getJavaStaticMethod() { return "removeDuplicatedCoordinates"; } /** * Returns a version of the given geometry with duplicated coordinates removed. * * @param geometry * @return */ public static Geometry removeDuplicatedCoordinates(Geometry geometry) { return removeCoordinates(geometry); } /** * Removes duplicated coordinates within a geometry. * * @param geom * @return */ public static Geometry removeCoordinates(Geometry geom) { if(geom ==null){ return null; } else if (geom.isEmpty()) { return geom; } else if (geom instanceof Point){ return geom; } else if (geom instanceof MultiPoint) { return removeCoordinates((MultiPoint) geom); } else if (geom instanceof LineString) { return removeCoordinates((LineString) geom); } else if (geom instanceof MultiLineString) { return removeCoordinates((MultiLineString) geom); } else if (geom instanceof Polygon) { return removeCoordinates((Polygon) geom); } else if (geom instanceof MultiPolygon) { return removeCoordinates((MultiPolygon) geom); } else if (geom instanceof GeometryCollection) { return removeCoordinates((GeometryCollection) geom); } return null; } /** * Removes duplicated coordinates within a MultiPoint. * * @param g * @return */ public static MultiPoint removeCoordinates(MultiPoint g) { Coordinate[] coords = CoordinateUtils.removeDuplicatedCoordinates(g.getCoordinates(),false); return FACTORY.createMultiPoint(coords); } /** * Removes duplicated coordinates within a LineString. * * @param g * @return */ public static LineString removeCoordinates(LineString g) { Coordinate[] coords = CoordinateUtils.removeDuplicatedCoordinates(g.getCoordinates(), false); return FACTORY.createLineString(coords); } /** * Removes duplicated coordinates within a linearRing. * * @param g * @return */ public static LinearRing removeCoordinates(LinearRing g) { Coordinate[] coords = CoordinateUtils.removeDuplicatedCoordinates(g.getCoordinates(),false); return FACTORY.createLinearRing(coords); } /** * Removes duplicated coordinates in a MultiLineString. * * @param g * @return */ public static MultiLineString removeCoordinates(MultiLineString g) { ArrayList<LineString> lines = new ArrayList<LineString>(); for (int i = 0; i < g.getNumGeometries(); i++) { LineString line = (LineString) g.getGeometryN(i); lines.add(removeCoordinates(line)); } return FACTORY.createMultiLineString(GeometryFactory.toLineStringArray(lines)); } /** * Removes duplicated coordinates within a Polygon. * * @param poly * @return */ public static Polygon removeCoordinates(Polygon poly) { Coordinate[] shellCoords = CoordinateUtils.removeDuplicatedCoordinates(poly.getExteriorRing().getCoordinates(),true); LinearRing shell = FACTORY.createLinearRing(shellCoords); ArrayList<LinearRing> holes = new ArrayList<LinearRing>(); for (int i = 0; i < poly.getNumInteriorRing(); i++) { Coordinate[] holeCoords = CoordinateUtils.removeDuplicatedCoordinates(poly.getInteriorRingN(i).getCoordinates(),true); holes.add(FACTORY.createLinearRing(holeCoords)); } return FACTORY.createPolygon(shell, GeometryFactory.toLinearRingArray(holes)); } /** * Removes duplicated coordinates within a MultiPolygon. * * @param g * @return */ public static MultiPolygon removeCoordinates(MultiPolygon g) { ArrayList<Polygon> polys = new ArrayList<Polygon>(); for (int i = 0; i < g.getNumGeometries(); i++) { Polygon poly = (Polygon) g.getGeometryN(i); polys.add(removeCoordinates(poly)); } return FACTORY.createMultiPolygon(GeometryFactory.toPolygonArray(polys)); } /** * Removes duplicated coordinates within a GeometryCollection * * @param g * @return */ public static GeometryCollection removeCoordinates(GeometryCollection g) { ArrayList<Geometry> geoms = new ArrayList<Geometry>(); for (int i = 0; i < g.getNumGeometries(); i++) { Geometry geom = g.getGeometryN(i); geoms.add(removeCoordinates(geom)); } return FACTORY.createGeometryCollection(GeometryFactory.toGeometryArray(geoms)); } }