Added avoid route search radius

This commit is contained in:
max-klaus 2020-02-09 11:36:54 +03:00
parent 3bf85b824e
commit f03bde7222
4 changed files with 17 additions and 12 deletions

View file

@ -151,7 +151,7 @@ public class OsmAndLocationProvider implements SensorEventListener {
startLocation.setTime(ms); startLocation.setTime(ms);
} }
RouteSegmentSearchResult searchResult = RouteSegmentSearchResult searchResult =
RoutingHelper.searchRouteSegment(currentLocation.getLatitude(), currentLocation.getLongitude(), roads); RoutingHelper.searchRouteSegment(currentLocation.getLatitude(), currentLocation.getLongitude(), -1, roads);
if (searchResult != null) { if (searchResult != null) {
currentRoad = searchResult.getRoadIndex(); currentRoad = searchResult.getRoadIndex();
currentSegment = searchResult.getSegmentIndex(); currentSegment = searchResult.getSegmentIndex();

View file

@ -24,6 +24,7 @@ import net.osmand.binary.RouteDataObject;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.data.PointDescription; import net.osmand.data.PointDescription;
import net.osmand.data.QuadPoint; import net.osmand.data.QuadPoint;
import net.osmand.data.RotatedTileBox;
import net.osmand.plus.ApplicationMode; import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
@ -44,6 +45,8 @@ import java.util.Map;
public class AvoidSpecificRoads { public class AvoidSpecificRoads {
private static final float MAX_AVOID_ROUTE_SEARCH_RADIUS_DP = 32f;
private OsmandApplication app; private OsmandApplication app;
private Map<LatLon, RouteDataObject> impassableRoads = new LinkedHashMap<>(); private Map<LatLon, RouteDataObject> impassableRoads = new LinkedHashMap<>();
@ -210,7 +213,7 @@ public class AvoidSpecificRoads {
}); });
} }
public void addImpassableRoad(@Nullable final MapActivity activity, public void addImpassableRoad(@Nullable final MapActivity mapActivity,
@NonNull final LatLon loc, @NonNull final LatLon loc,
final boolean showDialog, final boolean showDialog,
final boolean skipWritingSettings) { final boolean skipWritingSettings) {
@ -220,15 +223,17 @@ public class AvoidSpecificRoads {
ApplicationMode appMode = app.getRoutingHelper().getAppMode(); ApplicationMode appMode = app.getRoutingHelper().getAppMode();
List<RouteSegmentResult> roads = app.getRoutingHelper().getRoute().getOriginalRoute(); List<RouteSegmentResult> roads = app.getRoutingHelper().getRoute().getOriginalRoute();
if (roads != null) { if (mapActivity != null && roads != null) {
RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy();
float maxDistPx = MAX_AVOID_ROUTE_SEARCH_RADIUS_DP * tb.getDensity();
RouteSegmentSearchResult searchResult = RouteSegmentSearchResult searchResult =
RoutingHelper.searchRouteSegment(loc.getLatitude(), loc.getLongitude(), roads); RoutingHelper.searchRouteSegment(loc.getLatitude(), loc.getLongitude(), maxDistPx / tb.getPixDensity(), roads);
if (searchResult != null) { if (searchResult != null) {
QuadPoint point = searchResult.getPoint(); QuadPoint point = searchResult.getPoint();
LatLon newLoc = new LatLon(MapUtils.get31LatitudeY((int) point.y), MapUtils.get31LongitudeX((int) point.x)); LatLon newLoc = new LatLon(MapUtils.get31LatitudeY((int) point.y), MapUtils.get31LongitudeX((int) point.x));
ll.setLatitude(newLoc.getLatitude()); ll.setLatitude(newLoc.getLatitude());
ll.setLongitude(newLoc.getLongitude()); ll.setLongitude(newLoc.getLongitude());
addImpassableRoadInternal(roads.get(searchResult.getRoadIndex()).getObject(), ll, showDialog, activity, newLoc); addImpassableRoadInternal(roads.get(searchResult.getRoadIndex()).getObject(), ll, showDialog, mapActivity, newLoc);
if (!skipWritingSettings) { if (!skipWritingSettings) {
app.getSettings().addImpassableRoad(newLoc.getLatitude(), newLoc.getLongitude()); app.getSettings().addImpassableRoad(newLoc.getLatitude(), newLoc.getLongitude());
} }
@ -240,11 +245,11 @@ public class AvoidSpecificRoads {
@Override @Override
public boolean publish(RouteDataObject object) { public boolean publish(RouteDataObject object) {
if (object == null) { if (object == null) {
if (activity != null) { if (mapActivity != null) {
Toast.makeText(activity, R.string.error_avoid_specific_road, Toast.LENGTH_LONG).show(); Toast.makeText(mapActivity, R.string.error_avoid_specific_road, Toast.LENGTH_LONG).show();
} }
} else { } else {
addImpassableRoadInternal(object, ll, showDialog, activity, loc); addImpassableRoadInternal(object, ll, showDialog, mapActivity, loc);
} }
return true; return true;
} }
@ -319,7 +324,7 @@ public class AvoidSpecificRoads {
showDialog(activity); showDialog(activity);
} }
MapContextMenu menu = activity.getContextMenu(); MapContextMenu menu = activity.getContextMenu();
if (menu.isActive() && menu.getLatLon().equals(loc)) { if (menu.isActive()) {
menu.close(); menu.close();
} }
activity.refreshMap(); activity.refreshMap();

View file

@ -1251,13 +1251,13 @@ public class RoutingHelper {
} }
} }
public static RouteSegmentSearchResult searchRouteSegment(double latitude, double longitude, List<RouteSegmentResult> roads) { public static RouteSegmentSearchResult searchRouteSegment(double latitude, double longitude, double maxDist, List<RouteSegmentResult> roads) {
int roadIndex = -1; int roadIndex = -1;
int segmentIndex = -1; int segmentIndex = -1;
QuadPoint point = null; QuadPoint point = null;
int px = MapUtils.get31TileNumberX(longitude); int px = MapUtils.get31TileNumberX(longitude);
int py = MapUtils.get31TileNumberY(latitude); int py = MapUtils.get31TileNumberY(latitude);
double dist = 1000; double dist = maxDist < 0 ? 1000 : maxDist;
for (int i = 0; i < roads.size(); i++) { for (int i = 0; i < roads.size(); i++) {
RouteSegmentResult road = roads.get(i); RouteSegmentResult road = roads.get(i);
int startPointIndex = road.getStartPointIndex() < road.getEndPointIndex() ? road.getStartPointIndex() : road.getEndPointIndex(); int startPointIndex = road.getStartPointIndex() < road.getEndPointIndex() ? road.getStartPointIndex() : road.getEndPointIndex();

View file

@ -947,9 +947,9 @@ public class ContextMenuLayer extends OsmandMapLayer {
if (selectOnMap != null) { if (selectOnMap != null) {
LatLon latlon = tileBox.getLatLonFromPixel(point.x, point.y); LatLon latlon = tileBox.getLatLonFromPixel(point.x, point.y);
menu.init(latlon, null, null);
CallbackWithObject<LatLon> cb = selectOnMap; CallbackWithObject<LatLon> cb = selectOnMap;
cb.processResult(latlon); cb.processResult(latlon);
menu.init(latlon, null, null);
selectOnMap = null; selectOnMap = null;
return true; return true;
} }