brouter/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java
2023-12-14 18:46:25 +02:00

224 lines
6.4 KiB
Java

package btools.routingapp;
import android.os.Bundle;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import btools.router.FormatGpx;
import btools.router.FormatJson;
import btools.router.FormatKml;
import btools.router.OsmNodeNamed;
import btools.router.OsmTrack;
import btools.router.RoutingContext;
import btools.router.RoutingEngine;
import btools.router.RoutingParamCollector;
public class BRouterWorker {
private static final int OUTPUT_FORMAT_GPX = 0;
private static final int OUTPUT_FORMAT_KML = 1;
private static final int OUTPUT_FORMAT_JSON = 2;
public String baseDir;
public File segmentDir;
public String profileName;
public String profilePath;
public String rawTrackPath;
public List<OsmNodeNamed> waypoints;
public List<OsmNodeNamed> nogoList;
public List<OsmNodeNamed> nogoPolygonsList;
public String profileParams;
@SuppressWarnings("deprecation")
public String getTrackFromParams(Bundle params) {
int engineMode = 0;
if (params.containsKey("engineMode")) {
engineMode = params.getInt("engineMode", 0);
}
RoutingContext rc = new RoutingContext();
rc.rawTrackPath = rawTrackPath;
rc.localFunction = profilePath;
RoutingParamCollector routingParamCollector = new RoutingParamCollector();
// parameter pre control
if (params.containsKey("lonlats")) {
waypoints = routingParamCollector.getWayPointList(params.getString("lonlats"));
params.remove("lonlats");
}
if (params.containsKey("lats")) {
double[] lats = params.getDoubleArray("lats");
double[] lons = params.getDoubleArray("lons");
waypoints = routingParamCollector.readPositions(lons, lats);
params.remove("lons");
params.remove("lats");
}
if (waypoints == null) {
throw new IllegalArgumentException("no points!");
}
if (engineMode == 0) {
if (waypoints.size() < 2) {
throw new IllegalArgumentException("we need two lat/lon points at least!");
}
} else {
if (waypoints.size() < 1) {
throw new IllegalArgumentException("we need two lat/lon points at least!");
}
}
if (nogoList != null && nogoList.size() > 0) {
// forward already read nogos from filesystem
if (rc.nogopoints == null) {
rc.nogopoints = nogoList;
} else {
rc.nogopoints.addAll(nogoList);
}
}
Map<String, String> theParams = new HashMap<>();
for (String key : params.keySet()) {
Object value = params.get(key);
if (value instanceof double[]) {
String s = Arrays.toString(params.getDoubleArray(key));
s = s.replace("[", "").replace("]", "");
theParams.put(key, s);
} else {
theParams.put(key, value.toString());
}
}
routingParamCollector.setParams(rc, waypoints, theParams);
if (params.containsKey("extraParams")) {
Map<String, String> profileparams = null;
try {
profileparams = routingParamCollector.getUrlParams(params.getString("extraParams"));
routingParamCollector.setProfileParams(rc, profileparams);
} catch (UnsupportedEncodingException e) {
// ignore
}
}
String pathToFileResult = params.getString("pathToFileResult");
if (pathToFileResult != null) {
File f = new File(pathToFileResult);
File dir = f.getParentFile();
if (!dir.exists() || !dir.canWrite()) {
return "file folder does not exists or can not be written!";
}
}
long maxRunningTime = 60000;
String sMaxRunningTime = params.getString("maxRunningTime");
if (sMaxRunningTime != null) {
maxRunningTime = Integer.parseInt(sMaxRunningTime) * 1000L;
}
try {
writeTimeoutData(rc);
} catch (Exception e) {
}
RoutingEngine cr = new RoutingEngine(null, null, segmentDir, waypoints, rc, engineMode);
cr.quite = true;
cr.doRun(maxRunningTime);
if (engineMode == RoutingEngine.BROUTER_ENGINEMODE_ROUTING) {
// store new reference track if any
// (can exist for timed-out search)
if (cr.getFoundRawTrack() != null) {
try {
cr.getFoundRawTrack().writeBinary(rawTrackPath);
} catch (Exception e) {
}
}
if (cr.getErrorMessage() != null) {
return cr.getErrorMessage();
}
int writeFromat = OUTPUT_FORMAT_GPX;
if (rc.outputFormat != null) {
if ("kml".equals(rc.outputFormat)) writeFromat = OUTPUT_FORMAT_KML;
if ("json".equals(rc.outputFormat)) writeFromat = OUTPUT_FORMAT_JSON;
}
OsmTrack track = null;
track = cr.getFoundTrack();
if (track != null) {
track.exportWaypoints = rc.exportWaypoints;
if (pathToFileResult == null) {
switch (writeFromat) {
case OUTPUT_FORMAT_KML:
return new FormatKml(rc).format(track);
case OUTPUT_FORMAT_JSON:
return new FormatJson(rc).format(track);
case OUTPUT_FORMAT_GPX:
default:
return new FormatGpx(rc).format(track);
}
}
}
try {
switch (writeFromat) {
case OUTPUT_FORMAT_KML:
new FormatKml(rc).write(pathToFileResult, track);
break;
case OUTPUT_FORMAT_JSON:
new FormatJson(rc).write(pathToFileResult, track);
break;
case OUTPUT_FORMAT_GPX:
default:
new FormatGpx(rc).write(pathToFileResult, track);
break;
}
} catch (Exception e) {
return "error writing file: " + e;
}
} else { // get other infos
if (cr.getErrorMessage() != null) {
return cr.getErrorMessage();
}
return cr.getFoundInfo();
}
return null;
}
private void writeTimeoutData(RoutingContext rc) throws Exception {
String timeoutFile = baseDir + "/brouter/modes/timeoutdata.txt";
BufferedWriter bw = new BufferedWriter(new FileWriter(timeoutFile));
bw.write(profileName);
bw.write("\n");
bw.write(rc.rawTrackPath);
bw.write("\n");
writeWPList(bw, waypoints);
writeWPList(bw, rc.nogopoints);
bw.close();
}
private void writeWPList(BufferedWriter bw, List<OsmNodeNamed> wps) throws Exception {
bw.write(wps.size() + "\n");
for (OsmNodeNamed wp : wps) {
bw.write(wp.toString());
bw.write("\n");
}
}
}