package com.opendoorlogistics.core.geometry.functions;
import com.opendoorlogistics.api.geometry.ODLGeom;
import com.opendoorlogistics.api.tables.ODLColumnType;
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.operations.GeomContains;
import com.opendoorlogistics.core.tables.ColumnValueProcessor;
import com.vividsolutions.jts.geom.Geometry;
/**
* Function to test if a geometry contains a lat long
* @author Phil
*
*/
public class FmGeomContains extends FunctionImpl{
public FmGeomContains(Function geometry, Function latitude, Function longitude, Function epsg){
super(geometry,latitude,longitude,epsg);
}
public FmGeomContains(Function geometry, Function latitude, Function longitude){
super(geometry,latitude,longitude);
}
@Override
public Object execute(FunctionParameters parameters) {
FmGeomContainsParameters pms = readParameters(parameters);
if(pms==null){
return Functions.EXECUTION_ERROR;
}
switch(execute(pms)){
case ERROR:
return Functions.EXECUTION_ERROR;
case TRUE:
return 1L;
default:
case FALSE:
return 0L;
}
}
public enum ContainsResult{
TRUE,
FALSE,
ERROR
}
public ContainsResult execute(FmGeomContainsParameters pms) {
boolean contains = false;
if(pms.geometry!=null){
Geometry g = ((ODLGeomImpl)pms.geometry).getJTSGeometry();
if(g==null){
return ContainsResult.ERROR;
}
contains = GeomContains.containsPoint(g, pms.latitude, pms.longitude, pms.epsg);
}
return contains? ContainsResult.TRUE : ContainsResult.FALSE;
}
public FmGeomContainsParameters readParameters(FunctionParameters parameters){
FmGeomContainsParameters pms = new FmGeomContainsParameters();
Object [] childExe = executeChildFormulae(parameters, false);
if(childExe==null){
return null;
}
pms.geometry = (ODLGeom)ColumnValueProcessor.convertToMe(ODLColumnType.GEOM, childExe[0]);
if(childExe[0]!=null && pms.geometry==null){
return null;
}
pms.latitude = (Double)ColumnValueProcessor.convertToMe(ODLColumnType.DOUBLE, childExe[1]);
pms.longitude =(Double) ColumnValueProcessor.convertToMe(ODLColumnType.DOUBLE, childExe[2]);
if(pms.latitude==null || pms.longitude == null){
return null;
}
// null epsg is valid, it just means calculate in lat long space
if(isProjected()){
pms.epsg =(String)ColumnValueProcessor.convertToMe(ODLColumnType.STRING, childExe[3]);
}
return pms;
}
public Function geometry(){
return child(0);
}
public Function latitude(){
return child(1);
}
public Function longitude(){
return child(2);
}
public boolean isProjected(){
return nbChildren()>3;
}
public static class FmGeomContainsParameters{
public ODLGeom geometry;
public Double latitude;
public Double longitude;
public String epsg;
}
@Override
public Function deepCopy() {
throw new UnsupportedOperationException();
}
}