Add dynamic street association
This commit is contained in:
parent
0ba034d652
commit
6627691feb
5 changed files with 144 additions and 4 deletions
|
@ -1108,7 +1108,6 @@ Memoria proporcional %4$s MB (Limite Android %5$s MB, Dalvik %6$s MB).</string>
|
|||
<string name="recording_context_menu_precord">Hacer una foto</string>
|
||||
<string name="stop_routing_confirm">¿Seguro que quieres parar la navegación?</string>
|
||||
<string name="clear_dest_confirm">¿Seguro que quieres borrar tu punto de destino?</string>
|
||||
<string name="precise_routing_mode_descr"/>
|
||||
<string name="precise_routing_mode_descr">Activa el enrutamiento preciso para calcular rutas precisas sin fallos. Está muy limitado por la distancia y no utiliza la biblioteca nativa.</string>
|
||||
<string name="precise_routing_mode">Enrutado preciso (alfa)</string>
|
||||
</resources>
|
||||
|
|
118
OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java
Normal file
118
OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java
Normal file
|
@ -0,0 +1,118 @@
|
|||
package net.osmand.plus;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import net.osmand.Location;
|
||||
import net.osmand.binary.RouteDataObject;
|
||||
import net.osmand.osm.MapUtils;
|
||||
import net.osmand.router.BinaryRoutePlanner.RouteSegment;
|
||||
import net.osmand.router.GeneralRouter.GeneralRouterProfile;
|
||||
import net.osmand.router.RoutePlannerFrontEnd;
|
||||
import net.osmand.router.RoutingConfiguration;
|
||||
import net.osmand.router.RoutingContext;
|
||||
|
||||
public class CurrentPositionHelper {
|
||||
|
||||
private RouteDataObject lastFound;
|
||||
private Location lastAskedLocation = null;
|
||||
private Thread calculatingThread = null;
|
||||
private RoutingContext ctx;
|
||||
private OsmandApplication app;
|
||||
private ApplicationMode am;
|
||||
|
||||
public CurrentPositionHelper(OsmandApplication app) {
|
||||
this.app = app;
|
||||
}
|
||||
|
||||
private void initCtx(OsmandApplication app) {
|
||||
ResourceManager r = app.getResourceManager();
|
||||
am = app.getSettings().getApplicationMode();
|
||||
GeneralRouterProfile p ;
|
||||
if (am == ApplicationMode.BICYCLE) {
|
||||
p = GeneralRouterProfile.BICYCLE;
|
||||
} else if (am == ApplicationMode.PEDESTRIAN) {
|
||||
p = GeneralRouterProfile.PEDESTRIAN;
|
||||
} else {
|
||||
p = GeneralRouterProfile.CAR;
|
||||
}
|
||||
RoutingConfiguration cfg = RoutingConfiguration.getDefault().build(p.name().toLowerCase(), 10);
|
||||
ctx = new RoutingContext(cfg, null, r.getRoutingMapFiles());
|
||||
}
|
||||
|
||||
private RouteDataObject runUpdateInThread(Location loc) {
|
||||
RoutePlannerFrontEnd rp = new RoutePlannerFrontEnd(false);
|
||||
try {
|
||||
if(ctx == null || am != app.getSettings().getApplicationMode()) {
|
||||
initCtx(app);
|
||||
}
|
||||
RouteSegment sg = rp.findRouteSegment(loc.getLatitude(), loc.getLongitude(), ctx);
|
||||
return sg.getRoad();
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void scheduleRouteSegmentFind(final Location loc){
|
||||
if(calculatingThread == Thread.currentThread()) {
|
||||
lastFound = runUpdateInThread(loc);
|
||||
} else if(calculatingThread == null && loc != null) {
|
||||
calculatingThread = new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
lastFound = runUpdateInThread(loc);
|
||||
if (lastAskedLocation != loc) {
|
||||
// refresh and run new task if needed
|
||||
getLastKnownRouteSegment(lastAskedLocation);
|
||||
}
|
||||
} finally {
|
||||
calculatingThread = null;
|
||||
}
|
||||
}
|
||||
});
|
||||
calculatingThread.start();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static double getOrthogonalDistance(RouteDataObject r, Location loc){
|
||||
double d = 1000;
|
||||
if (r.getPointsLength() > 0) {
|
||||
double pLt = MapUtils.get31LatitudeY(r.getPoint31YTile(0));
|
||||
double pLn = MapUtils.get31LongitudeX(r.getPoint31XTile(0));
|
||||
for (int i = 1; i < r.getPointsLength(); i++) {
|
||||
double lt = MapUtils.get31LatitudeY(r.getPoint31YTile(i));
|
||||
double ln = MapUtils.get31LongitudeX(r.getPoint31XTile(i));
|
||||
double od = MapUtils.getOrthogonalDistance(loc.getLatitude(), loc.getLongitude(), pLt, pLn, lt, ln);
|
||||
if (od < d) {
|
||||
d = od;
|
||||
}
|
||||
pLt = lt;
|
||||
pLn = ln;
|
||||
}
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
public RouteDataObject getLastKnownRouteSegment(Location loc) {
|
||||
lastAskedLocation = loc;
|
||||
RouteDataObject r = lastFound;
|
||||
if (loc == null || loc.getAccuracy() > 50) {
|
||||
return null;
|
||||
}
|
||||
if (r == null) {
|
||||
scheduleRouteSegmentFind(loc);
|
||||
return null;
|
||||
}
|
||||
double d = getOrthogonalDistance(r, loc);
|
||||
if (d > 25) {
|
||||
scheduleRouteSegmentFind(loc);
|
||||
}
|
||||
if (d < 70) {
|
||||
return r;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -14,6 +14,7 @@ import net.osmand.access.AccessibleActivity;
|
|||
import net.osmand.access.AccessibleAlertBuilder;
|
||||
import net.osmand.access.AccessibleToast;
|
||||
import net.osmand.access.NavigationInfo;
|
||||
import net.osmand.binary.RouteDataObject;
|
||||
import net.osmand.data.MapTileDownloader.DownloadRequest;
|
||||
import net.osmand.data.MapTileDownloader.IMapDownloaderCallback;
|
||||
import net.osmand.map.IMapLocationListener;
|
||||
|
@ -24,6 +25,7 @@ import net.osmand.plus.BusyIndicator;
|
|||
import net.osmand.plus.FavouritesDbHelper;
|
||||
import net.osmand.plus.GPXUtilities;
|
||||
import net.osmand.plus.GPXUtilities.GPXFile;
|
||||
import net.osmand.plus.CurrentPositionHelper;
|
||||
import net.osmand.plus.MapScreen;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
|
@ -119,6 +121,7 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
private OsmandMapTileView mapView;
|
||||
private MapActivityActions mapActions;
|
||||
private MapActivityLayers mapLayers;
|
||||
private CurrentPositionHelper currentPositionHelper;
|
||||
private NavigationInfo navigationInfo;
|
||||
|
||||
private SavingTrackHelper savingTrackHelper;
|
||||
|
@ -167,6 +170,7 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
settings = getMyApplication().getSettings();
|
||||
mapActions = new MapActivityActions(this);
|
||||
mapLayers = new MapActivityLayers(this);
|
||||
currentPositionHelper = new CurrentPositionHelper(getMyApplication());
|
||||
navigationInfo = new NavigationInfo(this);
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
// Full screen is not used here
|
||||
|
@ -1044,6 +1048,10 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
return mapLayers.getLocationLayer().getLastKnownLocation();
|
||||
}
|
||||
|
||||
public RouteDataObject getLastRouteDataObject(){
|
||||
return currentPositionHelper.getLastKnownRouteSegment(getLastKnownLocation());
|
||||
}
|
||||
|
||||
public LatLon getMapLocation(){
|
||||
return new LatLon(mapView.getLatitude(), mapView.getLongitude());
|
||||
}
|
||||
|
@ -1438,7 +1446,7 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
}
|
||||
|
||||
|
||||
private boolean isMapLinkedToLocation(){
|
||||
public boolean isMapLinkedToLocation(){
|
||||
return isMapLinkedToLocation;
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ import java.util.Set;
|
|||
|
||||
import net.osmand.Algoritms;
|
||||
import net.osmand.access.AccessibleToast;
|
||||
import net.osmand.binary.RouteDataObject;
|
||||
import net.osmand.plus.ApplicationMode;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
|
@ -902,9 +903,14 @@ public class MapInfoLayer extends OsmandMapLayer {
|
|||
int di = map.getMapLayers().getRouteInfoLayer().getDirectionInfo();
|
||||
if (di >= 0 && map.getMapLayers().getRouteInfoLayer().isVisible()) {
|
||||
RouteDirectionInfo next = routingHelper.getRouteDirections().get(di);
|
||||
text = routingHelper.formatStreetName(next.getStreetName(), next.getRef());
|
||||
text = RoutingHelper.formatStreetName(next.getStreetName(), next.getRef());
|
||||
}
|
||||
}
|
||||
} else if(map.isMapLinkedToLocation()) {
|
||||
RouteDataObject rt = map.getLastRouteDataObject();
|
||||
if(rt != null) {
|
||||
text = RoutingHelper.formatStreetName(rt.getName(), rt.getRef());
|
||||
}
|
||||
}
|
||||
if(text == null) {
|
||||
text = "";
|
||||
|
|
|
@ -6,6 +6,7 @@ import java.util.Arrays;
|
|||
import net.osmand.Algoritms;
|
||||
import net.osmand.GeoidAltitudeCorrection;
|
||||
import net.osmand.Location;
|
||||
import net.osmand.binary.RouteDataObject;
|
||||
import net.osmand.osm.LatLon;
|
||||
import net.osmand.plus.OsmAndFormatter;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
|
@ -316,7 +317,15 @@ public class RouteInfoControls {
|
|||
|
||||
@Override
|
||||
public boolean updateInfo() {
|
||||
float mx = rh == null ? 0 : rh.getCurrentMaxSpeed();
|
||||
float mx = 0;
|
||||
if ((rh == null || !rh.isFollowingMode()) && map.isMapLinkedToLocation()) {
|
||||
RouteDataObject ro = map.getLastRouteDataObject();
|
||||
if(ro != null) {
|
||||
mx = ro.getMaximumSpeed();
|
||||
}
|
||||
} else {
|
||||
mx = rh.getCurrentMaxSpeed();
|
||||
}
|
||||
if (cachedSpeed != mx) {
|
||||
cachedSpeed = mx;
|
||||
if (cachedSpeed == 0) {
|
||||
|
|
Loading…
Reference in a new issue