/******************************************************************************* * 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 3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * ******************************************************************************/ package com.opendoorlogistics.core.distances.functions; import com.opendoorlogistics.api.distances.DistancesConfiguration; import com.opendoorlogistics.api.distances.DistancesConfiguration.CalculationMethod; import com.opendoorlogistics.api.tables.ODLColumnType; import com.opendoorlogistics.core.distances.DistancesSingleton; import com.opendoorlogistics.core.distances.DistancesSingleton.CacheOption; import com.opendoorlogistics.core.formulae.Function; import com.opendoorlogistics.core.formulae.FunctionImpl; import com.opendoorlogistics.core.formulae.FunctionParameters; import com.opendoorlogistics.core.formulae.Functions; import com.opendoorlogistics.core.geometry.ODLGeomImpl; import com.opendoorlogistics.core.geometry.Spatial; import com.opendoorlogistics.core.gis.map.data.LatLongImpl; import com.opendoorlogistics.core.tables.ColumnValueProcessor; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.LineString; public class FmDrivingRouteGeomFromLine extends FunctionImpl{ public FmDrivingRouteGeomFromLine(Function linestringgeom, Function graphhopperFile){ super(linestringgeom, graphhopperFile); } @Override public Function deepCopy() { return new FmDrivingRouteGeomFromLine(child(0).deepCopy(), child(1).deepCopy()); } @Override public String toString() { return toString("routegeom"); } @Override public Object execute(FunctionParameters parameters) { // get the geometry Spatial.initSpatial(); Object child = child(0).execute(parameters); if(child==null || child == Functions.EXECUTION_ERROR){ return Functions.EXECUTION_ERROR; } child = ColumnValueProcessor.convertToMe(ODLColumnType.GEOM, child); if(child==null){ return Functions.EXECUTION_ERROR; } Geometry geometry = ((ODLGeomImpl)child).getJTSGeometry(); if(geometry==null || LineString.class.isInstance(geometry)==false){ return Functions.EXECUTION_ERROR; } LineString ls = ((LineString)geometry); Coordinate start = ls.getCoordinateN(0); Coordinate end = ls.getCoordinateN(ls.getNumPoints()-1); LatLongImpl llStart = new LatLongImpl(start.y, start.x); LatLongImpl llEnd = new LatLongImpl(end.y, end.x); Object dir = child(1).execute(parameters); if(dir==null || dir == Functions.EXECUTION_ERROR){ return Functions.EXECUTION_ERROR; }; DistancesConfiguration config = new DistancesConfiguration(); config.setMethod(CalculationMethod.ROAD_NETWORK); config.getGraphhopperConfig().setGraphDirectory(dir.toString()); return DistancesSingleton.singleton().calculateRouteGeom(config, llStart, llEnd,CacheOption.USE_CACHING, null); } }