/* * This is part of Geomajas, a GIS framework, http://www.geomajas.org/. * * Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium. * * The program is available in open source according to the GNU Affero * General Public License. All contributions in this program are covered * by the Geomajas Contributors License Agreement. For full licensing * details, see LICENSE.txt in the project root. */ package org.geomajas.gwt.client.spatial.geometry.operation; import org.geomajas.geometry.Coordinate; import org.geomajas.gwt.client.spatial.geometry.Geometry; import org.geomajas.gwt.client.spatial.geometry.LineString; import org.geomajas.gwt.client.spatial.geometry.LinearRing; import org.geomajas.gwt.client.spatial.geometry.MultiLineString; import org.geomajas.gwt.client.spatial.geometry.MultiPoint; import org.geomajas.gwt.client.spatial.geometry.MultiPolygon; import org.geomajas.gwt.client.spatial.geometry.Point; import org.geomajas.gwt.client.spatial.geometry.Polygon; /** * This operation translates an entire {@link Geometry} to another location. * * @author Pieter De Graef */ public class TranslateGeometryOperation implements GeometryOperation { /** * Translation value along the X-axis. */ private double translateX; /** * Translation value along the Y-axis. */ private double translateY; /** * This constructor sets all the necessary parameter values. * * @param translateX * Translation value along the X-axis. * @param translateY * Translation value along the Y-axis. */ public TranslateGeometryOperation(double translateX, double translateY) { this.translateX = translateX; this.translateY = translateY; } /** * Execute the operation! * * @return Returns a new geometry. If the given geometry is null, then null is returned. */ public Geometry execute(Geometry geometry) { if (geometry == null) { return null; } if (geometry instanceof Point) { return translate((Point) geometry); } else if (geometry instanceof LinearRing) { return translate((LinearRing) geometry); } else if (geometry instanceof LineString) { return translate((LineString) geometry); } else if (geometry instanceof Polygon) { return translate((Polygon) geometry); } else if (geometry instanceof MultiPoint) { return translate((MultiPoint) geometry); } else if (geometry instanceof MultiLineString) { return translate((MultiLineString) geometry); } else if (geometry instanceof MultiPolygon) { return translate((MultiPolygon) geometry); } return null; } //------------------------------------------------------------------------- // Private functions translating every type of geometry: //------------------------------------------------------------------------- private Point translate(Point point) { Coordinate c = point.getCoordinate(); return point.getGeometryFactory().createPoint(new Coordinate(c.getX() + translateX, c.getY() + translateY)); } private LineString translate(LineString lineString) { Coordinate[] coordinates = new Coordinate[lineString.getNumPoints()]; for (int n = 0; n < lineString.getNumPoints(); n++) { Coordinate original = lineString.getCoordinateN(n); coordinates[n] = new Coordinate(original.getX() + translateX, original.getY() + translateY); } return lineString.getGeometryFactory().createLineString(coordinates); } private LinearRing translate(LinearRing linearRing) { Coordinate[] coordinates = new Coordinate[linearRing.getNumPoints()]; for (int n = 0; n < linearRing.getNumPoints(); n++) { Coordinate original = linearRing.getCoordinateN(n); coordinates[n] = new Coordinate(original.getX() + translateX, original.getY() + translateY); } return linearRing.getGeometryFactory().createLinearRing(coordinates); } private Polygon translate(Polygon polygon) { LinearRing exteriorRing = translate(polygon.getExteriorRing()); LinearRing[] interiorRings = new LinearRing[polygon.getNumInteriorRing()]; for (int n = 0; n < polygon.getNumInteriorRing(); n++) { interiorRings[n] = translate(polygon.getInteriorRingN(n)); } return polygon.getGeometryFactory().createPolygon(exteriorRing, interiorRings); } private MultiPoint translate(MultiPoint multiPoint) { Point[] points = new Point[multiPoint.getNumGeometries()]; for (int n = 0; n < multiPoint.getNumGeometries(); n++) { points[n] = translate((Point) multiPoint.getGeometryN(n)); } return multiPoint.getGeometryFactory().createMultiPoint(points); } private MultiLineString translate(MultiLineString multiLineString) { LineString[] lineStrings = new LineString[multiLineString.getNumGeometries()]; for (int n = 0; n < multiLineString.getNumGeometries(); n++) { lineStrings[n] = translate((LineString) multiLineString.getGeometryN(n)); } return multiLineString.getGeometryFactory().createMultiLineString(lineStrings); } private MultiPolygon translate(MultiPolygon multiPolygon) { Polygon[] polygons = new Polygon[multiPolygon.getNumGeometries()]; for (int n = 0; n < multiPolygon.getNumGeometries(); n++) { polygons[n] = translate((Polygon) multiPolygon.getGeometryN(n)); } return multiPolygon.getGeometryFactory().createMultiPolygon(polygons); } }