Add minor stop 10281
This commit is contained in:
parent
a80f463d2b
commit
605034783e
3 changed files with 108 additions and 17 deletions
|
@ -1,25 +1,9 @@
|
||||||
package net.osmand.binary;
|
package net.osmand.binary;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Calendar;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
|
|
||||||
import com.google.protobuf.CodedInputStream;
|
import com.google.protobuf.CodedInputStream;
|
||||||
import com.google.protobuf.InvalidProtocolBufferException;
|
import com.google.protobuf.InvalidProtocolBufferException;
|
||||||
import com.google.protobuf.WireFormat;
|
import com.google.protobuf.WireFormat;
|
||||||
|
|
||||||
import gnu.trove.iterator.TLongObjectIterator;
|
|
||||||
import gnu.trove.list.array.TIntArrayList;
|
|
||||||
import gnu.trove.list.array.TLongArrayList;
|
|
||||||
import gnu.trove.map.hash.TIntObjectHashMap;
|
|
||||||
import gnu.trove.map.hash.TLongObjectHashMap;
|
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.ResultMatcher;
|
import net.osmand.ResultMatcher;
|
||||||
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
|
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
|
||||||
|
@ -34,6 +18,23 @@ import net.osmand.util.Algorithms;
|
||||||
import net.osmand.util.MapUtils;
|
import net.osmand.util.MapUtils;
|
||||||
import net.osmand.util.OpeningHoursParser;
|
import net.osmand.util.OpeningHoursParser;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import gnu.trove.iterator.TLongObjectIterator;
|
||||||
|
import gnu.trove.list.array.TIntArrayList;
|
||||||
|
import gnu.trove.list.array.TLongArrayList;
|
||||||
|
import gnu.trove.map.hash.TIntObjectHashMap;
|
||||||
|
import gnu.trove.map.hash.TLongObjectHashMap;
|
||||||
|
|
||||||
public class BinaryMapRouteReaderAdapter {
|
public class BinaryMapRouteReaderAdapter {
|
||||||
protected static final Log LOG = PlatformUtil.getLog(BinaryMapRouteReaderAdapter.class);
|
protected static final Log LOG = PlatformUtil.getLog(BinaryMapRouteReaderAdapter.class);
|
||||||
private static final int SHIFT_COORDINATES = 4;
|
private static final int SHIFT_COORDINATES = 4;
|
||||||
|
@ -303,6 +304,7 @@ public class BinaryMapRouteReaderAdapter {
|
||||||
public int directionTrafficSignalsBackward = -1;
|
public int directionTrafficSignalsBackward = -1;
|
||||||
public int trafficSignals = -1;
|
public int trafficSignals = -1;
|
||||||
public int stopSign = -1;
|
public int stopSign = -1;
|
||||||
|
public int stopMinor = -1;
|
||||||
public int giveWaySign = -1;
|
public int giveWaySign = -1;
|
||||||
|
|
||||||
int nameTypeRule = -1;
|
int nameTypeRule = -1;
|
||||||
|
@ -363,6 +365,8 @@ public class BinaryMapRouteReaderAdapter {
|
||||||
destinationRefTypeRule = id;
|
destinationRefTypeRule = id;
|
||||||
} else if (tags.equals("highway") && val.equals("traffic_signals")){
|
} else if (tags.equals("highway") && val.equals("traffic_signals")){
|
||||||
trafficSignals = id;
|
trafficSignals = id;
|
||||||
|
} else if (tags.equals("stop") && val.equals("minor")) {
|
||||||
|
stopMinor = id;
|
||||||
} else if (tags.equals("highway") && val.equals("stop")){
|
} else if (tags.equals("highway") && val.equals("stop")){
|
||||||
stopSign = id;
|
stopSign = id;
|
||||||
} else if (tags.equals("highway") && val.equals("give_way")){
|
} else if (tags.equals("highway") && val.equals("give_way")){
|
||||||
|
|
|
@ -8,6 +8,7 @@ import net.osmand.util.Algorithms;
|
||||||
import net.osmand.util.MapUtils;
|
import net.osmand.util.MapUtils;
|
||||||
import net.osmand.util.TransliterationHelper;
|
import net.osmand.util.TransliterationHelper;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
|
@ -500,6 +501,17 @@ public class RouteDataObject {
|
||||||
return pointTypes[ind];
|
return pointTypes[ind];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removePointType(int ind, int type) {
|
||||||
|
if (pointTypes != null || ind < pointTypes.length) {
|
||||||
|
int[] typesArr = pointTypes[ind];
|
||||||
|
for (int t : typesArr) {
|
||||||
|
if (t == type) {
|
||||||
|
pointTypes[ind] = ArrayUtils.removeElement(typesArr, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int[] getTypes() {
|
public int[] getTypes() {
|
||||||
return types;
|
return types;
|
||||||
}
|
}
|
||||||
|
|
|
@ -176,12 +176,87 @@ public class RouteResultPreparation {
|
||||||
combineWayPointsForAreaRouting(ctx, result);
|
combineWayPointsForAreaRouting(ctx, result);
|
||||||
validateAllPointsConnected(result);
|
validateAllPointsConnected(result);
|
||||||
splitRoadsAndAttachRoadSegments(ctx, result, recalculation);
|
splitRoadsAndAttachRoadSegments(ctx, result, recalculation);
|
||||||
|
for (int i = 0; i < result.size(); i++) {
|
||||||
|
prepareStopSign(result.get(i));
|
||||||
|
}
|
||||||
calculateTimeSpeed(ctx, result);
|
calculateTimeSpeed(ctx, result);
|
||||||
|
|
||||||
prepareTurnResults(ctx, result);
|
prepareTurnResults(ctx, result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public RouteSegmentResult prepareStopSign(RouteSegmentResult seg) {
|
||||||
|
int start = seg.getStartPointIndex();
|
||||||
|
int end = seg.getEndPointIndex();
|
||||||
|
List<Integer> stops = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int i = start; i > end; i--) {
|
||||||
|
int[] pointTypes = seg.getObject().getPointTypes(i);
|
||||||
|
if (pointTypes != null) {
|
||||||
|
for (int j = 0; j < pointTypes.length; j++) {
|
||||||
|
if (pointTypes[j] == seg.getObject().region.stopMinor) {
|
||||||
|
stops.add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int stop : stops) {
|
||||||
|
List<RouteSegmentResult> attachedRoutes = seg.getAttachedRoutes(stop);
|
||||||
|
for (RouteSegmentResult attached : attachedRoutes) {
|
||||||
|
int attStopPriority = highwayStopPriority(attached.getObject().getHighway());
|
||||||
|
int segStopPriority = highwayStopPriority(seg.getObject().getHighway());
|
||||||
|
if (segStopPriority > attStopPriority) {
|
||||||
|
seg.getObject().removePointType(stop, seg.getObject().region.stopSign);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return seg;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int highwayStopPriority(String highway) {
|
||||||
|
if (highway.endsWith("trunk")) {
|
||||||
|
return 13;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("trunk_link")) {
|
||||||
|
return 12;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("primary")) {
|
||||||
|
return 11;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("primary_link")) {
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("secondary")) {
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("secondary_link")) {
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("tertiary")) {
|
||||||
|
return 7;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("tertiary_link")) {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("residential")) {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("living_street")) {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("track")) {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("footway")) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
if (highway.endsWith("path")) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
public void prepareTurnResults(RoutingContext ctx, List<RouteSegmentResult> result) {
|
public void prepareTurnResults(RoutingContext ctx, List<RouteSegmentResult> result) {
|
||||||
for (int i = 0; i < result.size(); i ++) {
|
for (int i = 0; i < result.size(); i ++) {
|
||||||
TurnType turnType = getTurnInfo(result, i, ctx.leftSideNavigation);
|
TurnType turnType = getTurnInfo(result, i, ctx.leftSideNavigation);
|
||||||
|
|
Loading…
Reference in a new issue