/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.core.api.impl; import com.opendoorlogistics.api.geometry.Geometry; import com.opendoorlogistics.api.geometry.LatLong; import com.opendoorlogistics.api.geometry.ODLGeom; import com.opendoorlogistics.core.geometry.GreateCircle; import com.opendoorlogistics.core.geometry.ODLGeomImpl; import com.opendoorlogistics.core.geometry.ODLLoadedGeometry; import com.opendoorlogistics.core.geometry.Spatial; import com.opendoorlogistics.core.gis.map.data.LatLongImpl; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LinearRing; import com.vividsolutions.jts.geom.Polygon; public class GeometryImpl implements Geometry { private final GeometryFactory geomfactory = new GeometryFactory(); @Override public LatLong createLatLong(double latitude, double longitude) { return new LatLongImpl(latitude, longitude); } @Override public ODLGeom createLineGeometry(LatLong... latLongs) { Coordinate[] coords = new Coordinate[latLongs.length]; for(int i =0 ; i<latLongs.length;i++){ coords[i] = new Coordinate(latLongs[i].getLongitude(), latLongs[i].getLatitude()); } ODLGeomImpl geom = new ODLLoadedGeometry(geomfactory.createLineString(coords)); return geom; } static{ Spatial.initSpatial(); } @Override public double calculateGreatCircleDistance(LatLong from, LatLong to) { return GreateCircle.greatCircleApprox(from, to); } @Override public ODLGeom createPolygon(LatLong [] outer, LatLong [][]holes) { LinearRing outerRing = geomfactory.createLinearRing(toCoords(outer)); int nholes = holes!=null ? holes.length : 0; LinearRing [] innerRings = new LinearRing[nholes]; for(int i =0 ; i < nholes ; i++){ innerRings[i] = geomfactory.createLinearRing(toCoords(holes[i])); } com.vividsolutions.jts.geom.Geometry g = geomfactory.createPolygon(outerRing, innerRings); return new ODLLoadedGeometry(g); } private Coordinate toCoordinate(LatLong ll){ return new Coordinate(ll.getLongitude(), ll.getLatitude()); } private Coordinate [] toCoords(LatLong [] lls){ Coordinate []ret = new Coordinate[lls.length]; for(int i =0 ; i < lls.length ; i++){ ret[i] = toCoordinate(lls[i]); } return ret; } @Override public ODLGeom createMultipolygon(ODLGeom[] polygons) { Polygon [] polys = new Polygon[polygons.length]; for(int i =0 ; i < polys.length ; i++){ polys[i] = (Polygon)((ODLGeomImpl)polygons[i]).getJTSGeometry(); } return new ODLLoadedGeometry(geomfactory.createMultiPolygon(polys)); } }