Added point names to route gpx
This commit is contained in:
parent
eb1c98ddf1
commit
8710881eea
6 changed files with 104 additions and 78 deletions
|
@ -8,6 +8,7 @@ import java.util.Collections;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import gnu.trove.iterator.TIntObjectIterator;
|
import gnu.trove.iterator.TIntObjectIterator;
|
||||||
import gnu.trove.map.hash.TIntObjectHashMap;
|
import gnu.trove.map.hash.TIntObjectHashMap;
|
||||||
|
@ -305,18 +306,6 @@ public class StringBundle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void putArray(String key, String[] array) {
|
|
||||||
if (array != null) {
|
|
||||||
map.put(key, new StringItem(key, strArrayToString(array)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void putArray(String key, String[][] array) {
|
|
||||||
if (array != null) {
|
|
||||||
map.put(key, new StringItem(key, strStrArrayToString(array)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public <T> void putMap(String key, TIntObjectHashMap<T> map) {
|
public <T> void putMap(String key, TIntObjectHashMap<T> map) {
|
||||||
if (map != null) {
|
if (map != null) {
|
||||||
StringBundle bundle = newInstance();
|
StringBundle bundle = newInstance();
|
||||||
|
@ -334,7 +323,7 @@ public class StringBundle {
|
||||||
public <K, V> void putMap(String key, Map<K, V> map) {
|
public <K, V> void putMap(String key, Map<K, V> map) {
|
||||||
if (map != null) {
|
if (map != null) {
|
||||||
StringBundle bundle = newInstance();
|
StringBundle bundle = newInstance();
|
||||||
for (Map.Entry<K, V> entry : map.entrySet()) {
|
for (Entry<K, V> entry : map.entrySet()) {
|
||||||
bundle.putString(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
|
bundle.putString(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
|
||||||
}
|
}
|
||||||
this.map.put(key, new StringBundleItem(key, bundle));
|
this.map.put(key, new StringBundleItem(key, bundle));
|
||||||
|
@ -433,17 +422,6 @@ public class StringBundle {
|
||||||
b.append(intArrayToString(arr));
|
b.append(intArrayToString(arr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
for (int i = 0; i < a.length; i++) {
|
|
||||||
int[] value = a[i];
|
|
||||||
if (value != null && value.length > 0) {
|
|
||||||
if (b.length() > 0) {
|
|
||||||
b.append(";");
|
|
||||||
}
|
|
||||||
b.append(i).append(":").append(intArrayToString(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
return b.toString();
|
return b.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -465,48 +443,6 @@ public class StringBundle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
String[] items = a.split(";");
|
|
||||||
int[][] res = new int[items.length][];
|
|
||||||
for (int i = 0; i < items.length; i++) {
|
|
||||||
String[] subItems = a.split(",");
|
|
||||||
res[i] = new int[subItems.length];
|
|
||||||
for (int k = 0; k < subItems.length; k++) {
|
|
||||||
res[i][k] = Integer.parseInt(subItems[k]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String strArrayToString(String[] a) {
|
|
||||||
if (a == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
StringBuilder b = new StringBuilder();
|
|
||||||
for (String value : a) {
|
|
||||||
if (b.length() > 0) {
|
|
||||||
b.append(0x1E);
|
|
||||||
}
|
|
||||||
b.append(value);
|
|
||||||
}
|
|
||||||
return b.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String strStrArrayToString(String[][] a) {
|
|
||||||
if (a == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
StringBuilder b = new StringBuilder();
|
|
||||||
for (int i = 0; i < a.length; i++) {
|
|
||||||
String[] value = a[i];
|
|
||||||
if (value != null && value.length > 0) {
|
|
||||||
if (b.length() > 0) {
|
|
||||||
b.append(0x1F);
|
|
||||||
}
|
|
||||||
b.append(String.valueOf(i)).append(":").append(strArrayToString(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return b.toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,10 @@ package net.osmand.router;
|
||||||
|
|
||||||
import net.osmand.Location;
|
import net.osmand.Location;
|
||||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
|
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
|
||||||
|
import net.osmand.binary.RouteDataObject;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -14,6 +16,7 @@ public class RouteDataResources {
|
||||||
|
|
||||||
private List<Location> locations;
|
private List<Location> locations;
|
||||||
private int currentLocation;
|
private int currentLocation;
|
||||||
|
private Map<RouteDataObject, int[][]> pointNamesMap = new HashMap<>();
|
||||||
|
|
||||||
public RouteDataResources() {
|
public RouteDataResources() {
|
||||||
this.locations = new ArrayList<>();
|
this.locations = new ArrayList<>();
|
||||||
|
@ -43,4 +46,8 @@ public class RouteDataResources {
|
||||||
public void incrementCurrentLocation(int index) {
|
public void incrementCurrentLocation(int index) {
|
||||||
currentLocation += index;
|
currentLocation += index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<RouteDataObject, int[][]> getPointNamesMap() {
|
||||||
|
return pointNamesMap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,7 +114,7 @@ public class RouteImporter {
|
||||||
if (gpxFile != null) {
|
if (gpxFile != null) {
|
||||||
GPXUtilities.loadGPXFile(null, gpxFile, extensionsReader);
|
GPXUtilities.loadGPXFile(null, gpxFile, extensionsReader);
|
||||||
for (RouteSegmentResult segment : route) {
|
for (RouteSegmentResult segment : route) {
|
||||||
segment.fillData();
|
segment.fillNames(resources);
|
||||||
}
|
}
|
||||||
} else if (file != null) {
|
} else if (file != null) {
|
||||||
FileInputStream fis = null;
|
FileInputStream fis = null;
|
||||||
|
@ -122,7 +122,7 @@ public class RouteImporter {
|
||||||
fis = new FileInputStream(file);
|
fis = new FileInputStream(file);
|
||||||
GPXFile gpxFile = GPXUtilities.loadGPXFile(fis, null, extensionsReader);
|
GPXFile gpxFile = GPXUtilities.loadGPXFile(fis, null, extensionsReader);
|
||||||
for (RouteSegmentResult segment : route) {
|
for (RouteSegmentResult segment : route) {
|
||||||
segment.fillData();
|
segment.fillNames(resources);
|
||||||
}
|
}
|
||||||
gpxFile.path = file.getAbsolutePath();
|
gpxFile.path = file.getAbsolutePath();
|
||||||
gpxFile.modifiedTime = file.lastModified();
|
gpxFile.modifiedTime = file.lastModified();
|
||||||
|
|
|
@ -87,6 +87,21 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (object.pointNameTypes != null) {
|
||||||
|
int start = Math.min(startPointIndex, endPointIndex);
|
||||||
|
int end = Math.min(Math.max(startPointIndex, endPointIndex) + 1, object.pointNameTypes.length);
|
||||||
|
for (int i = start; i < end; i++) {
|
||||||
|
int[] types = object.pointNameTypes[i];
|
||||||
|
if (types != null) {
|
||||||
|
for (int type : types) {
|
||||||
|
RouteTypeRule r = region.quickGetEncodingRule(type);
|
||||||
|
if (!rules.containsKey(r)) {
|
||||||
|
rules.put(r, rules.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void collectRules(Map<RouteTypeRule, Integer> rules, int[] types) {
|
private void collectRules(Map<RouteTypeRule, Integer> rules, int[] types) {
|
||||||
|
@ -158,7 +173,34 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void fillData() {
|
private int[][] convertPointNames(int[][] nameTypes, Map<RouteTypeRule, Integer> rules) {
|
||||||
|
if (nameTypes == null || nameTypes.length == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
int[][] res = new int[nameTypes.length][];
|
||||||
|
for (int i = 0; i < nameTypes.length; i++) {
|
||||||
|
int[] types = nameTypes[i];
|
||||||
|
if (types != null) {
|
||||||
|
int[] arr = new int[types.length];
|
||||||
|
for (int k = 0; k < types.length; k++) {
|
||||||
|
int type = types[k];
|
||||||
|
String tag = object.region.quickGetEncodingRule(type).getTag();
|
||||||
|
String name = object.pointNames[i][k];
|
||||||
|
RouteTypeRule rule = new RouteTypeRule(tag, name);
|
||||||
|
Integer ruleId = rules.get(rule);
|
||||||
|
if (ruleId == null) {
|
||||||
|
ruleId = rules.size();
|
||||||
|
rules.put(rule, ruleId);
|
||||||
|
}
|
||||||
|
arr[k] = ruleId;
|
||||||
|
}
|
||||||
|
res[i] = arr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fillNames(RouteDataResources resources) {
|
||||||
if (object.nameIds != null && object.nameIds.length > 0) {
|
if (object.nameIds != null && object.nameIds.length > 0) {
|
||||||
RouteRegion region = object.region;
|
RouteRegion region = object.region;
|
||||||
int nameTypeRule = region.getNameTypeRule();
|
int nameTypeRule = region.getNameTypeRule();
|
||||||
|
@ -176,6 +218,33 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
String[][] pointNames = null;
|
||||||
|
int[][] pointNameTypes = null;
|
||||||
|
int[][] pointNamesArr = resources.getPointNamesMap().get(object);
|
||||||
|
if (pointNamesArr != null) {
|
||||||
|
pointNames = new String[pointNamesArr.length][];
|
||||||
|
pointNameTypes = new int[pointNamesArr.length][];
|
||||||
|
for (int i = 0; i < pointNamesArr.length; i++) {
|
||||||
|
int[] namesIds = pointNamesArr[i];
|
||||||
|
if (namesIds != null) {
|
||||||
|
pointNames[i] = new String[namesIds.length];
|
||||||
|
pointNameTypes[i] = new int[namesIds.length];
|
||||||
|
for (int k = 0; k < namesIds.length; k++) {
|
||||||
|
int id = namesIds[k];
|
||||||
|
RouteTypeRule r = object.region.quickGetEncodingRule(id);
|
||||||
|
if (r != null) {
|
||||||
|
pointNames[i][k] = r.getValue();
|
||||||
|
int nameType = object.region.searchRouteEncodingRule(r.getTag(), null);
|
||||||
|
if (nameType != -1) {
|
||||||
|
pointNameTypes[i][k] = nameType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
object.pointNames = pointNames;
|
||||||
|
object.pointNameTypes = pointNameTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -199,15 +268,22 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
||||||
}
|
}
|
||||||
bundle.putLong("id", object.id);
|
bundle.putLong("id", object.id);
|
||||||
bundle.putArray("types", convertTypes(object.types, rules));
|
bundle.putArray("types", convertTypes(object.types, rules));
|
||||||
|
|
||||||
int start = Math.min(startPointIndex, endPointIndex);
|
int start = Math.min(startPointIndex, endPointIndex);
|
||||||
int end = Math.max(startPointIndex, endPointIndex);
|
int end = Math.max(startPointIndex, endPointIndex) + 1;
|
||||||
if (object.hasPointTypes()) {
|
if (object.pointTypes != null && start < object.pointTypes.length) {
|
||||||
bundle.putArray("pointTypes", convertTypes(
|
int[][] types = Arrays.copyOfRange(object.pointTypes, start, Math.min(end, object.pointTypes.length));
|
||||||
Arrays.copyOfRange(object.pointTypes, start, Math.min(end + 1, object.pointTypes.length)), rules));
|
bundle.putArray("pointTypes", convertTypes(types, rules));
|
||||||
}
|
}
|
||||||
if (object.hasPointNames()) {
|
if (object.nameIds != null) {
|
||||||
bundle.putArray("names", convertNameIds(object.nameIds, rules));
|
bundle.putArray("names", convertNameIds(object.nameIds, rules));
|
||||||
}
|
}
|
||||||
|
if (object.pointNameTypes != null && start < object.pointNameTypes.length) {
|
||||||
|
int[][] types = Arrays.copyOfRange(object.pointNameTypes, start, Math.min(end, object.pointNameTypes.length));
|
||||||
|
if (object.pointNames != null) {
|
||||||
|
bundle.putArray("pointNames", convertPointNames(types, rules));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -231,6 +307,10 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
||||||
object.types = bundle.getIntArray("types", null);
|
object.types = bundle.getIntArray("types", null);
|
||||||
object.pointTypes = bundle.getIntIntArray("pointTypes", null);
|
object.pointTypes = bundle.getIntIntArray("pointTypes", null);
|
||||||
object.nameIds = bundle.getIntArray("names", null);
|
object.nameIds = bundle.getIntArray("names", null);
|
||||||
|
int[][] pointNames = bundle.getIntIntArray("pointNames", null);
|
||||||
|
if (pointNames != null) {
|
||||||
|
bundle.getResources().getPointNamesMap().put(object, pointNames);
|
||||||
|
}
|
||||||
|
|
||||||
RouteDataResources resources = bundle.getResources();
|
RouteDataResources resources = bundle.getResources();
|
||||||
object.pointsX = new int[length];
|
object.pointsX = new int[length];
|
||||||
|
|
|
@ -23,6 +23,7 @@ import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
|
||||||
import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
|
import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
|
||||||
import net.osmand.plus.routing.RouteProvider.RouteService;
|
import net.osmand.plus.routing.RouteProvider.RouteService;
|
||||||
import net.osmand.router.RouteCalculationProgress;
|
import net.osmand.router.RouteCalculationProgress;
|
||||||
|
import net.osmand.router.RouteExporter;
|
||||||
import net.osmand.router.RouteSegmentResult;
|
import net.osmand.router.RouteSegmentResult;
|
||||||
import net.osmand.router.TurnType;
|
import net.osmand.router.TurnType;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
@ -245,7 +246,9 @@ public class RoutingHelper {
|
||||||
return currentGPXRoute;
|
return currentGPXRoute;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isCurrentGPXRouteV2() {
|
||||||
|
return currentGPXRoute != null && RouteExporter.OSMAND_ROUTER_V2.equals(currentGPXRoute.getFile().author);
|
||||||
|
}
|
||||||
|
|
||||||
public void setGpxParams(GPXRouteParamsBuilder params) {
|
public void setGpxParams(GPXRouteParamsBuilder params) {
|
||||||
currentGPXRoute = params;
|
currentGPXRoute = params;
|
||||||
|
|
|
@ -407,7 +407,7 @@ public class RouteInfoWidgetsFactory {
|
||||||
@Override
|
@Override
|
||||||
public boolean updateInfo(DrawSettings drawSettings) {
|
public boolean updateInfo(DrawSettings drawSettings) {
|
||||||
float mx = 0;
|
float mx = 0;
|
||||||
if ((rh == null || !rh.isFollowingMode() || rh.isDeviatedFromRoute() || rh.getCurrentGPXRoute() != null)
|
if ((rh == null || !rh.isFollowingMode() || rh.isDeviatedFromRoute() || !rh.isCurrentGPXRouteV2())
|
||||||
&& trackingUtilities.isMapLinkedToLocation()) {
|
&& trackingUtilities.isMapLinkedToLocation()) {
|
||||||
RouteDataObject ro = locationProvider.getLastKnownRouteSegment();
|
RouteDataObject ro = locationProvider.getLastKnownRouteSegment();
|
||||||
if(ro != null) {
|
if(ro != null) {
|
||||||
|
@ -811,7 +811,7 @@ public class RouteInfoWidgetsFactory {
|
||||||
int[] loclanes = null;
|
int[] loclanes = null;
|
||||||
int dist = 0;
|
int dist = 0;
|
||||||
// TurnType primary = null;
|
// TurnType primary = null;
|
||||||
if ((rh == null || !rh.isFollowingMode() || rh.isDeviatedFromRoute() || rh.getCurrentGPXRoute() != null)
|
if ((rh == null || !rh.isFollowingMode() || rh.isDeviatedFromRoute() || !rh.isCurrentGPXRouteV2())
|
||||||
&& trackingUtilities.isMapLinkedToLocation() && settings.SHOW_LANES.get()) {
|
&& trackingUtilities.isMapLinkedToLocation() && settings.SHOW_LANES.get()) {
|
||||||
RouteDataObject ro = locationProvider.getLastKnownRouteSegment();
|
RouteDataObject ro = locationProvider.getLastKnownRouteSegment();
|
||||||
Location lp = locationProvider.getLastKnownLocation();
|
Location lp = locationProvider.getLastKnownLocation();
|
||||||
|
@ -1272,7 +1272,7 @@ public class RouteInfoWidgetsFactory {
|
||||||
if ((rh.isFollowingMode() || trackingUtilities.isMapLinkedToLocation())
|
if ((rh.isFollowingMode() || trackingUtilities.isMapLinkedToLocation())
|
||||||
&& showRoutingAlarms && (trafficWarnings || cams)) {
|
&& showRoutingAlarms && (trafficWarnings || cams)) {
|
||||||
AlarmInfo alarm;
|
AlarmInfo alarm;
|
||||||
if(rh.isFollowingMode() && !rh.isDeviatedFromRoute() && rh.getCurrentGPXRoute() == null) {
|
if(rh.isFollowingMode() && !rh.isDeviatedFromRoute() && (rh.getCurrentGPXRoute() == null || rh.isCurrentGPXRouteV2())) {
|
||||||
alarm = wh.getMostImportantAlarm(settings.SPEED_SYSTEM.get(), cams);
|
alarm = wh.getMostImportantAlarm(settings.SPEED_SYSTEM.get(), cams);
|
||||||
} else {
|
} else {
|
||||||
RouteDataObject ro = locationProvider.getLastKnownRouteSegment();
|
RouteDataObject ro = locationProvider.getLastKnownRouteSegment();
|
||||||
|
|
Loading…
Reference in a new issue