Impassable roads layer. Icons showing.
This commit is contained in:
parent
3aa63e40fc
commit
e9798b248d
5 changed files with 115 additions and 32 deletions
|
@ -1,6 +1,11 @@
|
||||||
package net.osmand.router;
|
package net.osmand.router;
|
||||||
|
|
||||||
import gnu.trove.set.hash.TLongHashSet;
|
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
|
||||||
|
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
|
||||||
|
import net.osmand.binary.RouteDataObject;
|
||||||
|
import net.osmand.router.BinaryRoutePlanner.RouteSegment;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
|
import net.osmand.util.MapUtils;
|
||||||
|
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -14,12 +19,7 @@ import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
|
import gnu.trove.set.hash.TLongHashSet;
|
||||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
|
|
||||||
import net.osmand.binary.RouteDataObject;
|
|
||||||
import net.osmand.router.BinaryRoutePlanner.RouteSegment;
|
|
||||||
import net.osmand.util.Algorithms;
|
|
||||||
import net.osmand.util.MapUtils;
|
|
||||||
|
|
||||||
public class GeneralRouter implements VehicleRouter {
|
public class GeneralRouter implements VehicleRouter {
|
||||||
|
|
||||||
|
@ -875,7 +875,7 @@ public class GeneralRouter implements VehicleRouter {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addImpassableRoads(TLongHashSet impassableRoads) {
|
public void addImpassableRoads(Set<Long> impassableRoads) {
|
||||||
if (impassableRoads != null && !impassableRoads.isEmpty()) {
|
if (impassableRoads != null && !impassableRoads.isEmpty()) {
|
||||||
if (this.impassableRoads == null) {
|
if (this.impassableRoads == null) {
|
||||||
this.impassableRoads = new TLongHashSet();
|
this.impassableRoads = new TLongHashSet();
|
||||||
|
|
|
@ -1,15 +1,6 @@
|
||||||
package net.osmand.router;
|
package net.osmand.router;
|
||||||
|
|
||||||
import gnu.trove.set.hash.TLongHashSet;
|
import net.osmand.Location;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Stack;
|
|
||||||
|
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.binary.RouteDataObject;
|
import net.osmand.binary.RouteDataObject;
|
||||||
import net.osmand.router.GeneralRouter.GeneralRouterProfile;
|
import net.osmand.router.GeneralRouter.GeneralRouterProfile;
|
||||||
|
@ -20,6 +11,15 @@ import net.osmand.util.Algorithms;
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
public class RoutingConfiguration {
|
public class RoutingConfiguration {
|
||||||
|
|
||||||
public static final int DEFAULT_MEMORY_LIMIT = 30;
|
public static final int DEFAULT_MEMORY_LIMIT = 30;
|
||||||
|
@ -55,12 +55,12 @@ public class RoutingConfiguration {
|
||||||
private String defaultRouter = "";
|
private String defaultRouter = "";
|
||||||
private Map<String, GeneralRouter> routers = new LinkedHashMap<String, GeneralRouter>();
|
private Map<String, GeneralRouter> routers = new LinkedHashMap<String, GeneralRouter>();
|
||||||
private Map<String, String> attributes = new LinkedHashMap<String, String>();
|
private Map<String, String> attributes = new LinkedHashMap<String, String>();
|
||||||
private TLongHashSet impassableRoadIds = new TLongHashSet();
|
private HashMap<Long, Location> impassableRoadLocations = new HashMap<>();
|
||||||
private List<RouteDataObject> impassableRoads = new ArrayList<RouteDataObject>();
|
private List<RouteDataObject> impassableRoads = new ArrayList<RouteDataObject>();
|
||||||
|
|
||||||
// Example
|
// Example
|
||||||
// {
|
// {
|
||||||
// impassableRoadIds.add(23000069L);
|
// impassableRoadLocations.add(23000069L);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
public RoutingConfiguration build(String router, int memoryLimitMB) {
|
public RoutingConfiguration build(String router, int memoryLimitMB) {
|
||||||
|
@ -87,7 +87,7 @@ public class RoutingConfiguration {
|
||||||
i.initialDirection = direction;
|
i.initialDirection = direction;
|
||||||
i.recalculateDistance = parseSilentFloat(getAttribute(i.router, "recalculateDistanceHelp"), i.recalculateDistance) ;
|
i.recalculateDistance = parseSilentFloat(getAttribute(i.router, "recalculateDistanceHelp"), i.recalculateDistance) ;
|
||||||
i.heuristicCoefficient = parseSilentFloat(getAttribute(i.router, "heuristicCoefficient"), i.heuristicCoefficient);
|
i.heuristicCoefficient = parseSilentFloat(getAttribute(i.router, "heuristicCoefficient"), i.heuristicCoefficient);
|
||||||
i.router.addImpassableRoads(impassableRoadIds);
|
i.router.addImpassableRoads(impassableRoadLocations.keySet());
|
||||||
i.ZOOM_TO_LOAD_TILES = parseSilentInt(getAttribute(i.router, "zoomToLoadTiles"), i.ZOOM_TO_LOAD_TILES);
|
i.ZOOM_TO_LOAD_TILES = parseSilentInt(getAttribute(i.router, "zoomToLoadTiles"), i.ZOOM_TO_LOAD_TILES);
|
||||||
int desirable = parseSilentInt(getAttribute(i.router, "memoryLimitInMB"), 0);
|
int desirable = parseSilentInt(getAttribute(i.router, "memoryLimitInMB"), 0);
|
||||||
if(desirable != 0) {
|
if(desirable != 0) {
|
||||||
|
@ -109,14 +109,14 @@ public class RoutingConfiguration {
|
||||||
return impassableRoads;
|
return impassableRoads;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TLongHashSet getImpassableRoadIds() {
|
public Map<Long, Location> getImpassableRoadLocations() {
|
||||||
return impassableRoadIds;
|
return impassableRoadLocations;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addImpassableRoad(RouteDataObject r) {
|
public void addImpassableRoad(RouteDataObject route, Location location) {
|
||||||
if (!impassableRoadIds.contains(r.id)){
|
if (!impassableRoadLocations.containsKey(route.id)){
|
||||||
impassableRoadIds.add(r.id);
|
impassableRoadLocations.put(route.id, location);
|
||||||
impassableRoads.add(r);
|
impassableRoads.add(route);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ public class RoutingConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeImpassableRoad(RouteDataObject obj) {
|
public void removeImpassableRoad(RouteDataObject obj) {
|
||||||
impassableRoadIds.remove(obj.id);
|
impassableRoadLocations.remove(obj.id);
|
||||||
impassableRoads.remove(obj);
|
impassableRoads.remove(obj);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ import net.osmand.plus.views.ContextMenuLayer;
|
||||||
import net.osmand.plus.views.DownloadedRegionsLayer;
|
import net.osmand.plus.views.DownloadedRegionsLayer;
|
||||||
import net.osmand.plus.views.FavoritesLayer;
|
import net.osmand.plus.views.FavoritesLayer;
|
||||||
import net.osmand.plus.views.GPXLayer;
|
import net.osmand.plus.views.GPXLayer;
|
||||||
|
import net.osmand.plus.views.ImpassableRoadsLayer;
|
||||||
import net.osmand.plus.views.MapControlsLayer;
|
import net.osmand.plus.views.MapControlsLayer;
|
||||||
import net.osmand.plus.views.MapInfoLayer;
|
import net.osmand.plus.views.MapInfoLayer;
|
||||||
import net.osmand.plus.views.MapTextLayer;
|
import net.osmand.plus.views.MapTextLayer;
|
||||||
|
@ -71,6 +72,7 @@ public class MapActivityLayers {
|
||||||
private TransportInfoLayer transportInfoLayer;
|
private TransportInfoLayer transportInfoLayer;
|
||||||
private PointLocationLayer locationLayer;
|
private PointLocationLayer locationLayer;
|
||||||
private PointNavigationLayer navigationLayer;
|
private PointNavigationLayer navigationLayer;
|
||||||
|
private ImpassableRoadsLayer impassableRoadsLayer;
|
||||||
private MapInfoLayer mapInfoLayer;
|
private MapInfoLayer mapInfoLayer;
|
||||||
private MapTextLayer mapTextLayer;
|
private MapTextLayer mapTextLayer;
|
||||||
private ContextMenuLayer contextMenuLayer;
|
private ContextMenuLayer contextMenuLayer;
|
||||||
|
@ -141,6 +143,9 @@ public class MapActivityLayers {
|
||||||
// 7. point navigation layer
|
// 7. point navigation layer
|
||||||
navigationLayer = new PointNavigationLayer(activity);
|
navigationLayer = new PointNavigationLayer(activity);
|
||||||
mapView.addLayer(navigationLayer, 7);
|
mapView.addLayer(navigationLayer, 7);
|
||||||
|
// 7.5 Impassible roads
|
||||||
|
impassableRoadsLayer = new ImpassableRoadsLayer(activity);
|
||||||
|
mapView.addLayer(impassableRoadsLayer, 7.5f);
|
||||||
// 8. context menu layer
|
// 8. context menu layer
|
||||||
contextMenuLayer = new ContextMenuLayer(activity);
|
contextMenuLayer = new ContextMenuLayer(activity);
|
||||||
mapView.addLayer(contextMenuLayer, 8);
|
mapView.addLayer(contextMenuLayer, 8);
|
||||||
|
@ -422,6 +427,10 @@ public class MapActivityLayers {
|
||||||
return navigationLayer;
|
return navigationLayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ImpassableRoadsLayer getImpassableRoadsLayer() {
|
||||||
|
return impassableRoadsLayer;
|
||||||
|
}
|
||||||
|
|
||||||
public GPXLayer getGpxLayer() {
|
public GPXLayer getGpxLayer() {
|
||||||
return gpxLayer;
|
return gpxLayer;
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,7 +144,7 @@ public class AvoidSpecificRoads {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
private void findRoad(final MapActivity activity, final LatLon loc) {
|
private void findRoad(final MapActivity activity, final LatLon loc) {
|
||||||
Location ll = new Location("");
|
final Location ll = new Location("");
|
||||||
ll.setLatitude(loc.getLatitude());
|
ll.setLatitude(loc.getLatitude());
|
||||||
ll.setLongitude(loc.getLongitude());
|
ll.setLongitude(loc.getLongitude());
|
||||||
app.getLocationProvider().getRouteSegment(ll, new ResultMatcher<RouteDataObject>() {
|
app.getLocationProvider().getRouteSegment(ll, new ResultMatcher<RouteDataObject>() {
|
||||||
|
@ -154,7 +154,7 @@ public class AvoidSpecificRoads {
|
||||||
if(object == null) {
|
if(object == null) {
|
||||||
Toast.makeText(activity, R.string.error_avoid_specific_road, Toast.LENGTH_LONG).show();
|
Toast.makeText(activity, R.string.error_avoid_specific_road, Toast.LENGTH_LONG).show();
|
||||||
} else {
|
} else {
|
||||||
getBuilder().addImpassableRoad(object);
|
getBuilder().addImpassableRoad(object, ll);
|
||||||
RoutingHelper rh = app.getRoutingHelper();
|
RoutingHelper rh = app.getRoutingHelper();
|
||||||
if(rh.isRouteCalculated() || rh.isRouteBeingCalculated()) {
|
if(rh.isRouteCalculated() || rh.isRouteBeingCalculated()) {
|
||||||
rh.recalculateRouteDueToSettingsChange();
|
rh.recalculateRouteDueToSettingsChange();
|
||||||
|
|
74
OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java
Normal file
74
OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
package net.osmand.plus.views;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
|
||||||
|
import net.osmand.Location;
|
||||||
|
import net.osmand.data.RotatedTileBox;
|
||||||
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.activities.MapActivity;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Denis on
|
||||||
|
* 20.03.2015.
|
||||||
|
*/
|
||||||
|
public class ImpassableRoadsLayer extends OsmandMapLayer {
|
||||||
|
|
||||||
|
private static final int startZoom = 10;
|
||||||
|
private final MapActivity activity;
|
||||||
|
private Bitmap roadWorkIcon;
|
||||||
|
private OsmandMapTileView view;
|
||||||
|
private Paint paint;
|
||||||
|
private Map<Long, Location> missingRoads;
|
||||||
|
|
||||||
|
public ImpassableRoadsLayer(MapActivity activity) {
|
||||||
|
this.activity = activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initLayer(OsmandMapTileView view) {
|
||||||
|
this.view = view;
|
||||||
|
roadWorkIcon = BitmapFactory.decodeResource(view.getResources(), R.drawable.ic_action_road_works_dark);
|
||||||
|
paint = new Paint();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
|
||||||
|
if (tileBox.getZoom() >= startZoom) {
|
||||||
|
for (long id : getMissingRoads().keySet()) {
|
||||||
|
Location location = getMissingRoads().get(id);
|
||||||
|
float x = tileBox.getPixXFromLatLon(location.getLatitude(), location.getLongitude());
|
||||||
|
float y = tileBox.getPixYFromLatLon(location.getLatitude(), location.getLongitude());
|
||||||
|
float left = x - roadWorkIcon.getWidth() / 2;
|
||||||
|
float top = y - roadWorkIcon.getHeight() / 2;
|
||||||
|
canvas.drawBitmap(roadWorkIcon, left, top, paint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<Long, Location> getMissingRoads() {
|
||||||
|
if(missingRoads == null) {
|
||||||
|
missingRoads = activity.getMyApplication().getDefaultRoutingConfig().getImpassableRoadLocations();
|
||||||
|
}
|
||||||
|
return missingRoads;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroyLayer() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean drawInScreenPixels() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue