/*******************************************************************************
* 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.geometry.LatLong;
import com.opendoorlogistics.core.formulae.Function;
import com.opendoorlogistics.core.formulae.FunctionParameters;
import com.opendoorlogistics.core.geometry.GreateCircle;
import com.opendoorlogistics.core.geometry.Spatial;
public abstract class FmDistance extends FmAbstractTravelCost {
private final double multiplyMetresBy;
public FmDistance(Function lat1, Function lng1, Function lat2, Function lng2,double multiplyMetresBy) {
super(lat1, lng1, lat2, lng2);
this.multiplyMetresBy = multiplyMetresBy;
}
public FmDistance(Function geom1, Function geom2,double multiplyMetresBy) {
super(geom1, geom2);
this.multiplyMetresBy = multiplyMetresBy;
}
@Override
public Object execute(FunctionParameters parameters) {
Spatial.initSpatial();
boolean isLatLongs = nbChildren()== 4;
return execute(parameters, isLatLongs);
}
@Override
protected Object calculateTravel(FunctionParameters parameters,LatLong[] lls, boolean isLatLongs,Object[] childExe ) {
double ret = GreateCircle.greatCircleApprox(lls[0], lls[1]);
return ret * multiplyMetresBy;
}
public static class Metres extends FmDistance{
public Metres(Function geom1, Function geom2) {
super(geom1, geom2, 1);
}
public Metres(Function lat1, Function lng1, Function lat2, Function lng2) {
super(lat1, lng1, lat2, lng2, 1);
}
}
public static class Km extends FmDistance{
public Km(Function geom1, Function geom2) {
super(geom1, geom2, DistancesConsts.METRES_TO_KM);
}
public Km(Function lat1, Function lng1, Function lat2, Function lng2) {
super(lat1, lng1, lat2, lng2, DistancesConsts.METRES_TO_KM);
}
}
public static class Miles extends FmDistance{
public Miles(Function geom1, Function geom2) {
super(geom1, geom2, DistancesConsts.METRES_TO_MILES);
}
public Miles(Function lat1, Function lng1, Function lat2, Function lng2) {
super(lat1, lng1, lat2, lng2, DistancesConsts.METRES_TO_MILES);
}
}
}