Added navigation

This commit is contained in:
2015-12-22 23:48:57 +01:00
parent 7ad8e3251a
commit 12a7baf7d4
19 changed files with 618 additions and 108 deletions
-2
View File
@@ -101,8 +101,6 @@ namespace NavCityBreda
}
}
public static string RouteImagesFolder { get { return "Routes/img/"; } }
// ===============================
+162
View File
@@ -0,0 +1,162 @@
using NavCityBreda.Model;
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json.Linq;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace NavCityBreda.Helpers
{
class RouteParser
{
public static Route LoadRoute(string foldername)
{
if (!Directory.Exists("Routes/" + foldername))
throw new FileNotFoundException("The route folder does not exist: " + foldername);
string datafile = "Routes/" + foldername + "/data.json";
string mediafolder = "Routes/" + foldername + "/media";
if (!File.Exists(datafile))
throw new FileNotFoundException("The route data file does not exist.");
string json = File.ReadAllText(datafile);
JObject o = JObject.Parse(json);
string error;
if (!ValidateRouteObject(o, out error))
throw new FileLoadException("Invalid Route information in " + datafile + ", " + error);
Route r = new Route((string)o["name"], (string)o["description"], (string)o["landmarks"], foldername);
JToken[] waypoints = o["waypoints"].ToArray();
int count = 0;
foreach(JToken t in waypoints)
{
if(!ValidateWaypointObject(t, out error))
throw new FileLoadException("Invalid Waypoint information in " + datafile + ", " + error);
Waypoint w;
if ((bool)t["landmark"])
{
List<Image> images = new List<Image>();
if(! t["image"].NullOrEmpty())
{
JToken img = t["image"];
if (img.Type == JTokenType.String)
{
if(ImageExists(foldername, (string)img))
images.Add(new Image(ImagePath(foldername, (string)img)));
}
else if(img.Type == JTokenType.Array)
{
foreach(string s in img.ToArray())
{
if (ImageExists(foldername, s))
images.Add(new Image(ImagePath(foldername, s)));
}
}
}
w = new Landmark((double)t["latitude"], (double)t["longitude"], (string)t["name"], count, (string)t["description"], images);
}
else
w = new Waypoint((double)t["latitude"], (double)t["longitude"], (string)t["name"], count);
r.Add(w);
count++;
}
return r;
}
private static bool ImageExists(string foldername, string imagename)
{
return File.Exists("Routes/" + foldername + "/media/" + imagename);
}
private static string ImagePath(string foldername, string imagename)
{
return "/Routes/" + foldername + "/media/" + imagename;
}
private static bool ValidateRouteObject(JObject o, out string error)
{
bool valid = true;
error = "Success";
if (o["name"].NullOrEmpty())
{
valid = false;
error = "Name missing";
}
if (o["description"].NullOrEmpty())
{
valid = false;
error = "Description missing";
}
if (o["landmarks"].NullOrEmpty())
{
valid = false;
error = "Landmarks missing";
}
if (o["waypoints"].NullOrEmpty())
{
valid = false;
error = "Waypoints missing or empty";
}
return valid;
}
private static bool ValidateWaypointObject(JToken o, out string error)
{
bool valid = true;
error = "Success";
if (o["name"].NullOrEmpty())
{
valid = false;
error = "Name missing";
}
if (o["landmark"].NullOrEmpty())
{
valid = false;
error = "Landmark missing";
}
if (o["latitude"].NullOrEmpty())
{
valid = false;
error = "Latitude missing";
}
if (o["longitude"].NullOrEmpty())
{
valid = false;
error = "Longitude missing";
}
if( valid && (bool)o["landmark"])
{
if (o["description"].NullOrEmpty())
{
valid = false;
error = "Description missing";
}
}
return valid;
}
}
}
+3
View File
@@ -29,6 +29,9 @@ namespace NavCityBreda.Helpers
static Settings()
{
LOCAL_SETTINGS.Values["tracking"] = true;
if (CurrentLanguage == "")
ApplicationLanguages.PrimaryLanguageOverride = "en";
}
public static async void ChangeLanguage(string lang)
+70 -9
View File
@@ -117,14 +117,14 @@ namespace NavCityBreda.Helpers
return address;
}
public static MapPolyline GetRouteLine(MapRoute m, Color color, int thickness = 10, bool dashed = false)
public static MapPolyline GetRouteLine(MapRoute m, Color color, int zindex, int thickness = 5)
{
var line = new MapPolyline
{
StrokeThickness = thickness,
StrokeColor = color,
StrokeDashed = dashed,
ZIndex = 2
StrokeDashed = false,
ZIndex = zindex
};
if (m != null)
@@ -133,14 +133,14 @@ namespace NavCityBreda.Helpers
return line;
}
public static MapPolyline GetRouteLine(List<BasicGeoposition> positions, Color color, int thickness = 10, bool dashed = false)
public static MapPolyline GetRouteLine(List<BasicGeoposition> positions, Color color, int zindex, int thickness = 5)
{
var line = new MapPolyline
{
StrokeThickness = thickness,
StrokeColor = color,
StrokeDashed = dashed,
ZIndex = 2
StrokeDashed = false,
ZIndex = zindex
};
line.Path = new Geopath(positions);
@@ -148,14 +148,14 @@ namespace NavCityBreda.Helpers
return line;
}
public static MapPolyline GetRouteLine(BasicGeoposition p1, BasicGeoposition p2, Color color, int thickness = 10, bool dashed = false)
public static MapPolyline GetRouteLine(BasicGeoposition p1, BasicGeoposition p2, Color color, int zindex, int thickness = 5)
{
var line = new MapPolyline
{
StrokeThickness = thickness,
StrokeColor = color,
StrokeDashed = dashed,
ZIndex = 2
StrokeDashed = false,
ZIndex = zindex
};
List<BasicGeoposition> plist = new List<BasicGeoposition>();
@@ -186,5 +186,66 @@ namespace NavCityBreda.Helpers
ToastNotification toast = new ToastNotification(toastXml);
ToastNotificationManager.CreateToastNotifier().Show(toast);
}
public static string TranslatedManeuver(MapRouteManeuver maneuver)
{
string response = "";
bool onstreet = false;
switch(maneuver.Kind)
{
default:
response = Util.Loader.GetString("RouteSeeMap");
break;
case MapRouteManeuverKind.End:
response = Util.Loader.GetString("RouteEnd");
break;
case MapRouteManeuverKind.GoStraight:
response = Util.Loader.GetString("RouteGoStraight");
onstreet = true;
break;
case MapRouteManeuverKind.None:
response = Util.Loader.GetString("RouteNone");
break;
case MapRouteManeuverKind.Start:
response = Util.Loader.GetString("RouteStart");
break;
case MapRouteManeuverKind.TurnHardLeft:
case MapRouteManeuverKind.TurnLeft:
response = Util.Loader.GetString("RouteLeft");
onstreet = true;
break;
case MapRouteManeuverKind.TurnHardRight:
case MapRouteManeuverKind.TurnRight:
response = Util.Loader.GetString("RouteRight");
onstreet = true;
break;
case MapRouteManeuverKind.TrafficCircleLeft:
response = Util.Loader.GetString("RouteTrafficCircleLeft");
onstreet = true;
break;
case MapRouteManeuverKind.TrafficCircleRight:
response = Util.Loader.GetString("RouteTrafficCircleRight");
onstreet = true;
break;
case MapRouteManeuverKind.TurnKeepLeft:
case MapRouteManeuverKind.TurnLightLeft:
response = Util.Loader.GetString("RouteKeepLeft");
break;
case MapRouteManeuverKind.TurnKeepRight:
case MapRouteManeuverKind.TurnLightRight:
response = Util.Loader.GetString("RouteKeepRight");
break;
case MapRouteManeuverKind.UTurnLeft:
case MapRouteManeuverKind.UTurnRight:
response = Util.Loader.GetString("RouteUTurn");
break;
}
if (onstreet)
response += " " + Util.Loader.GetString("RouteOn") + " " + maneuver.StreetName;
return response;
}
}
}
+39
View File
@@ -174,6 +174,45 @@
<data name="Route" xml:space="preserve">
<value>Route</value>
</data>
<data name="RouteEnd" xml:space="preserve">
<value>You have reached your destination</value>
</data>
<data name="RouteGoStraight" xml:space="preserve">
<value>Go straight</value>
</data>
<data name="RouteKeepLeft" xml:space="preserve">
<value>Keep left</value>
</data>
<data name="RouteKeepRight" xml:space="preserve">
<value>Keep right</value>
</data>
<data name="RouteLeft" xml:space="preserve">
<value>Go left</value>
</data>
<data name="RouteNone" xml:space="preserve">
<value>No new action required</value>
</data>
<data name="RouteOn" xml:space="preserve">
<value>on</value>
</data>
<data name="RouteRight" xml:space="preserve">
<value>Go right</value>
</data>
<data name="RouteSeeMap" xml:space="preserve">
<value>See the map for details</value>
</data>
<data name="RouteStart" xml:space="preserve">
<value>Follow the route drawn on the map</value>
</data>
<data name="RouteTrafficCircleLeft" xml:space="preserve">
<value>At the roundabout go left</value>
</data>
<data name="RouteTrafficCircleRight" xml:space="preserve">
<value>At the roundabout go right</value>
</data>
<data name="RouteUTurn" xml:space="preserve">
<value>Make a U-turn</value>
</data>
<data name="Satellite" xml:space="preserve">
<value>Satellite</value>
</data>
+39
View File
@@ -201,4 +201,43 @@
<data name="WiFi" xml:space="preserve">
<value>WiFi</value>
</data>
<data name="RouteEnd" xml:space="preserve">
<value>U heeft uw bestemming bereikt</value>
</data>
<data name="RouteGoStraight" xml:space="preserve">
<value>Ga rechtdoor</value>
</data>
<data name="RouteKeepLeft" xml:space="preserve">
<value>Links aanhouden</value>
</data>
<data name="RouteKeepRight" xml:space="preserve">
<value>Rechts aanhouden</value>
</data>
<data name="RouteLeft" xml:space="preserve">
<value>Ga linksaf</value>
</data>
<data name="RouteNone" xml:space="preserve">
<value>Geen nieuw actie vereist</value>
</data>
<data name="RouteOn" xml:space="preserve">
<value>op</value>
</data>
<data name="RouteRight" xml:space="preserve">
<value>Ga rechtsaf</value>
</data>
<data name="RouteSeeMap" xml:space="preserve">
<value>Zie de kaart voor meer detail</value>
</data>
<data name="RouteStart" xml:space="preserve">
<value>Volg de route die op de kaart getekent is</value>
</data>
<data name="RouteTrafficCircleLeft" xml:space="preserve">
<value>Sla op de rotonde linksaf</value>
</data>
<data name="RouteTrafficCircleRight" xml:space="preserve">
<value>Sla op de rotonde rechtsaf</value>
</data>
<data name="RouteUTurn" xml:space="preserve">
<value>Keer indien mogelijk om</value>
</data>
</root>
+4 -1
View File
@@ -52,7 +52,10 @@
<RelativePanel Grid.Row="0">
<Button RelativePanel.AlignLeftWithPanel="True" Name="NavButton" Click="NavButton_Click" VerticalAlignment="Stretch" FontFamily="Segoe MDL2 Assets" Content="&#xE700;" FontSize="28" />
<TextBlock RelativePanel.RightOf="NavButton" FontSize="28" Margin="10,0,0,0" Name="PageTitle" Text="{Binding Map}" />
<Viewbox RelativePanel.RightOf="NavButton" RelativePanel.AlignBottomWith="NavButton" StretchDirection="DownOnly" Stretch="UniformToFill" Margin="10,0,10,0">
<TextBlock FontSize="28" Name="PageTitle" Text="{Binding Map}" />
</Viewbox>
</RelativePanel>
<!-- http://stackoverflow.com/questions/32108362/uwp-swipe-to-open-splitview-pane-->
+4 -8
View File
@@ -10,17 +10,14 @@ namespace NavCityBreda.Model
{
public class CompassTracker
{
public delegate void OnHeadingUpdatedHandler(object sender, HeadingUpdatedEventArgs e);
public event OnHeadingUpdatedHandler OnHeadingUpdated;
public delegate void OnHeadingUpdateHandler(object sender, HeadingUpdatedEventArgs e);
public event OnHeadingUpdateHandler OnHeadingUpdate;
public delegate void OnHeadingUpdateSlowHandler(object sender, HeadingUpdatedEventArgs e);
public event OnHeadingUpdateSlowHandler OnSlowHeadingUpdated;
private Compass comp;
private string status;
public string Status { get { return status; } }
private CompassReading hdn;
public CompassReading Heading { get { return hdn; } }
@@ -29,7 +26,6 @@ namespace NavCityBreda.Model
public CompassTracker()
{
status = "Waiting...";
comp = Compass.GetDefault();
// Assign an event handler for the compass reading-changed event
@@ -54,9 +50,9 @@ namespace NavCityBreda.Model
hdn = r;
//Make sure someone is listening
if (OnHeadingUpdated == null) return;
if (OnHeadingUpdate == null) return;
OnHeadingUpdated(this, new HeadingUpdatedEventArgs(r));
OnHeadingUpdate(this, new HeadingUpdatedEventArgs(r));
}
private void UpdateSlowHeading(CompassReading r)
+23 -6
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -49,21 +50,27 @@ namespace NavCityBreda.Model
public async void ForceRefresh()
{
if (geo == null)
StartTracking();
await StartTracking();
else
_position = await geo.GetGeopositionAsync();
}
public async void TryConnectIfNull()
{
if (geo == null)
await StartTracking();
}
public void ClearHistory()
{
_history.Clear();
}
public async void StartTracking()
public async Task<String> StartTracking()
{
// Request permission to access location
if (Status != PositionStatus.NotAvailable && Status != PositionStatus.NotInitialized)
return;
return "Already Connected";
var accessStatus = await Geolocator.RequestAccessAsync();
@@ -76,30 +83,39 @@ namespace NavCityBreda.Model
ReportInterval = 1500
};
ClearHistory();
Connected = true;
geo.PositionChanged += Geo_PositionChanged;
geo.StatusChanged += Geo_StatusChanged;
_status = PositionStatus.Initializing;
break;
return "Connected";
case GeolocationAccessStatus.Denied:
Connected = false;
_status = PositionStatus.NotAvailable;
bool result = await Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));
break;
return "Denied";
default:
case GeolocationAccessStatus.Unspecified:
Connected = false;
_status = PositionStatus.NotAvailable;
break;
return "Error";
}
}
private void Geo_StatusChanged(Geolocator sender, StatusChangedEventArgs args)
{
if(args.Status == PositionStatus.Disabled)
{
geo = null;
Connected = false;
}
UpdateStatus(args.Status);
}
@@ -109,6 +125,7 @@ namespace NavCityBreda.Model
UpdatePosition(_history.Last(), args.Position);
else
_position = args.Position;
_history.Add(args.Position);
}
+92 -18
View File
@@ -21,8 +21,13 @@ namespace NavCityBreda.Model
public delegate void OnLandmarkVisitedHandler(object sender, LandmarkVisitedEventArgs e);
public event OnLandmarkVisitedHandler OnLandmarkVisited;
public delegate void OnRouteChangedHandler (object sender, RouteChangedEventArgs e);
public event OnRouteChangedHandler OnRouteChanged;
public delegate void OnLandmarkChangedHandler (object sender, LandmarkChangedEventArgs e);
public event OnLandmarkChangedHandler OnLandmarkChanged;
public delegate void OnManeuverChangedHandler (object sender, ManeuverChangedEventArgs e);
public event OnManeuverChangedHandler OnManeuverChanged;
private List<Route> _routes;
public List<Route> Routes { get { return _routes; } }
@@ -30,12 +35,22 @@ namespace NavCityBreda.Model
private Route _currentroute;
public Route CurrentRoute { get { return _currentroute; } }
public string LoadingElement;
private Landmark _currentlandmark;
public Landmark CurrentLandmark { get { return _currentlandmark; } }
private MapRoute _routetolandmark;
public MapRoute RouteToLandmark { get { return _routetolandmark; } }
public MapRoute RouteToLandmark { get { return _routetolandmark; } }
private int _currentroutelegcount;
private List<MapRouteLeg> _currentroutelegs;
private int _currentmaneuvercount;
private MapRouteManeuver _currentmaneuver;
public MapRouteManeuver CurrentManeuver { get { return _currentmaneuver; } }
public string LoadingElement;
public enum RouteStatus { LOADING, STOPPED, STARTED }
public RouteStatus Status;
@@ -50,18 +65,50 @@ namespace NavCityBreda.Model
LoadingElement = Util.Loader.GetString("Initializing") + "...";
Status = RouteStatus.LOADING;
GeofenceMonitor.Current.GeofenceStateChanged += Current_GeofenceStateChanged;
App.Geo.OnPositionUpdate += Geo_OnPositionUpdate;
LoadRoutes();
}
private void Geo_OnPositionUpdate(object sender, PositionUpdatedEventArgs e)
{
if(Status == RouteStatus.STARTED)
{
double dif_lat = Math.Abs(_currentmaneuver.StartingPoint.Position.Latitude - e.New.Coordinate.Point.Position.Latitude);
double dif_lon = Math.Abs(_currentmaneuver.StartingPoint.Position.Longitude - e.New.Coordinate.Point.Position.Longitude);
if (dif_lat > 0.000012 && dif_lon > 0.000012) return;
//Only continue if you are at the maneuver point
_currentmaneuvercount++;
if(_currentmaneuvercount >= _currentroutelegs[_currentroutelegcount].Maneuvers.Count)
{
_currentmaneuvercount--;
_currentroutelegcount++;
if(_currentroutelegcount >= _currentroutelegs.Count)
{
_currentroutelegcount--;
return;
}
}
_currentmaneuver = _currentroutelegs[_currentroutelegcount].Maneuvers[_currentmaneuvercount];
UpdateManeuver(_currentmaneuver);
}
}
private void Current_GeofenceStateChanged(GeofenceMonitor sender, object args)
{
if (Status != RouteStatus.STARTED) return;
var reports = sender.ReadReports();
foreach (GeofenceStateChangeReport report in reports)
{
GeofenceState state = report.NewState;
Geofence geofence = report.Geofence;
Landmark i = App.RouteManager.CurrentRoute.Landmarks.Where(t => t.Id == geofence.Id).First();
Landmark i = CurrentRoute.Landmarks.Where(t => t.Id == geofence.Id).FirstOrDefault();
if (state == GeofenceState.Removed)
{
@@ -95,11 +142,10 @@ namespace NavCityBreda.Model
foreach(string folder in routefolders)
{
Debug.WriteLine(folder);
string foldername = Path.GetFileName(folder);
if (foldername != "img")
{
Route r = JSONParser.LoadRoute(foldername);
Route r = RouteParser.LoadRoute(foldername);
LoadingElement = Util.Loader.GetString("Loading") + " " + r.Name + "...";
await r.CalculateRoute();
_routes.Add(r);
@@ -110,22 +156,30 @@ namespace NavCityBreda.Model
Status = RouteStatus.STOPPED;
}
public async void UpdateRoute()
public async Task<String> UpdateRoute()
{
if (App.Geo.Position == null) return;
if (App.Geo.Position == null) return "error";
_currentlandmark = _currentroute.Landmarks.FirstOrDefault(p => !p.Visited);
_routetolandmark = await Util.FindWalkingRoute(App.Geo.Position.Coordinate.Point, _currentlandmark.Location);
_currentroutelegs = _routetolandmark.Legs.ToList() as List<MapRouteLeg>;
_currentroutelegcount = 0;
_currentmaneuvercount = 0;
_currentmaneuver = _currentroutelegs[_currentroutelegcount].Maneuvers[_currentmaneuvercount];
UpdateRoute(_routetolandmark, _currentlandmark);
UpdateManeuver(_currentmaneuver);
return "success";
}
public void StartRoute(Route r)
public async void StartRoute(Route r)
{
Util.SendToastNotification("Starting", "TRANSLATED MESSAGE");
App.Geo.ClearHistory();
_currentroute = r;
UpdateRoute();
await UpdateRoute();
UpdateStatus(RouteStatus.STARTED);
}
@@ -137,6 +191,10 @@ namespace NavCityBreda.Model
_currentroute = null;
_currentlandmark = null;
_routetolandmark = null;
_currentroutelegcount = 0;
_currentroutelegs = null;
_currentmaneuvercount = 0;
_currentmaneuver = null;
UpdateStatus(RouteStatus.STOPPED);
}
}
@@ -153,7 +211,6 @@ namespace NavCityBreda.Model
OnStatusUpdate(this, new RouteStatusChangedEventArgs(status));
}
//Handle Events
private void LandmarkVisited(Landmark l, LandmarkVisitedEventArgs.VisitedStatus status)
{
// Make sure someone is listening to event
@@ -162,13 +219,20 @@ namespace NavCityBreda.Model
OnLandmarkVisited(this, new LandmarkVisitedEventArgs(l, status));
}
//Handle Events
private void UpdateRoute(MapRoute route, Landmark l)
{
// Make sure someone is listening to event
if (OnRouteChanged == null) return;
if (OnLandmarkChanged == null) return;
OnRouteChanged(this, new RouteChangedEventArgs(route, l));
OnLandmarkChanged(this, new LandmarkChangedEventArgs(route, l));
}
private void UpdateManeuver(MapRouteManeuver curman)
{
// Make sure someone is listening to event
if (OnManeuverChanged == null) return;
OnManeuverChanged(this, new ManeuverChangedEventArgs(curman));
}
}
@@ -195,15 +259,25 @@ namespace NavCityBreda.Model
}
}
public class RouteChangedEventArgs : EventArgs
public class LandmarkChangedEventArgs : EventArgs
{
public Landmark Landmark { get; private set; }
public MapRoute Route { get; private set; }
public RouteChangedEventArgs(MapRoute newroute, Landmark tolandmark)
public LandmarkChangedEventArgs(MapRoute newroute, Landmark tolandmark)
{
Route = newroute;
Landmark = tolandmark;
}
}
public class ManeuverChangedEventArgs
{
public MapRouteManeuver Maneuver { get; private set; }
public ManeuverChangedEventArgs(MapRouteManeuver curman)
{
Maneuver = curman;
}
}
}
+29 -29
View File
@@ -109,38 +109,36 @@
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Routes\historische_kilometer\data.json" />
<Content Include="Routes\img\default.jpg" />
<Content Include="Routes\img\historische_kilometer_1.jpg" />
<Content Include="Routes\img\historische_kilometer_10.jpg" />
<Content Include="Routes\img\historische_kilometer_11.jpg" />
<Content Include="Routes\img\historische_kilometer_12.jpg" />
<Content Include="Routes\img\historische_kilometer_13.jpg" />
<Content Include="Routes\img\historische_kilometer_14.jpg" />
<Content Include="Routes\img\historische_kilometer_15.jpg" />
<Content Include="Routes\img\historische_kilometer_16.jpg" />
<Content Include="Routes\img\historische_kilometer_17.jpg" />
<Content Include="Routes\img\historische_kilometer_18.jpg" />
<Content Include="Routes\img\historische_kilometer_19.jpg" />
<Content Include="Routes\img\historische_kilometer_2.jpg" />
<Content Include="Routes\img\historische_kilometer_20.jpg" />
<Content Include="Routes\img\historische_kilometer_21.jpg" />
<Content Include="Routes\img\historische_kilometer_22.jpg" />
<Content Include="Routes\img\historische_kilometer_23.jpg" />
<Content Include="Routes\img\historische_kilometer_24.jpg" />
<Content Include="Routes\img\historische_kilometer_25.jpg" />
<Content Include="Routes\img\historische_kilometer_26.jpg" />
<Content Include="Routes\img\historische_kilometer_3.jpg" />
<Content Include="Routes\img\historische_kilometer_4.jpg" />
<Content Include="Routes\img\historische_kilometer_5.jpg" />
<Content Include="Routes\img\historische_kilometer_6.jpg" />
<Content Include="Routes\img\historische_kilometer_7.jpg" />
<Content Include="Routes\img\historische_kilometer_8.jpg" />
<Content Include="Routes\img\historische_kilometer_9.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_1.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_10.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_11.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_12.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_13.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_14.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_15.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_16.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_17.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_18.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_19.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_2.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_20.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_21.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_22.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_23.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_24.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_25.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_26.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_3.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_4.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_5.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_6.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_7.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_8.jpg" />
<Content Include="Routes\historische_kilometer\media\historische_kilometer_9.jpg" />
<PRIResource Include="Routes\historische_kilometer\lang\en\Resources.resw" />
<PRIResource Include="Routes\historische_kilometer\lang\nl\Resources.resw" />
<PRIResource Include="Routes\historische_kilometer\lang\de\Resources.resw" />
<PRIResource Include="Languages\ja\Resources.resw" />
<PRIResource Include="Languages\de\Resources.resw" />
<PRIResource Include="Languages\nl\Resources.resw" />
<None Include="project.json" />
<PRIResource Include="Languages\en\Resources.resw" />
@@ -152,7 +150,7 @@
<Compile Include="Helpers\BoolToCheckmarkConverter.cs" />
<Compile Include="Helpers\BoudingBox.cs" />
<Compile Include="Helpers\Extensions.cs" />
<Compile Include="Helpers\JSONParser.cs" />
<Compile Include="Helpers\RouteParser.cs" />
<Compile Include="Helpers\Settings.cs" />
<Compile Include="Helpers\BoolToVisibilityConverter.cs" />
<Compile Include="Helpers\Util.cs" />
@@ -164,6 +162,7 @@
</Compile>
<Compile Include="Model\CompassTracker.cs" />
<Compile Include="Model\GeoTracker.cs" />
<Compile Include="Model\Image.cs" />
<Compile Include="Model\Landmark.cs" />
<Compile Include="Model\Route.cs" />
<Compile Include="Model\RouteManager.cs" />
@@ -283,6 +282,7 @@
</Page>
</ItemGroup>
<ItemGroup>
<Folder Include="Languages\de\" />
<Folder Include="Routes\historische_kilometer\lang\ja\" />
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
@@ -117,6 +117,12 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="HBDescription" xml:space="preserve">
<value>The Hous of Brecht is one of the most historical buildings in Breda.</value>
</data>
<data name="HBName" xml:space="preserve">
<value>House of Brecht</value>
</data>
<data name="KBDescription" xml:space="preserve">
<value>TRANSLATE: Dit plein bevindt zich aan de zuiderzijde van het kasteel. U heeft zo een mooi uitzicht op de monumentale poort, de zgn. Stadhouderspoort met het wapen van stadhouder Willem de Vijfde, dat overigens pas later is aangebracht. Achter u ziet u het ruiterstandbeeld van stadhouder koning Willem III geplaatst. Voor dit standbeeld werd onder de burgerij van Breda een inzameling gehouden die f 47.000,-- opbracht. Voor de oude Nassaustad Breda is de stadhouderkoning van grote betekenis geweest. Hij voltooide na anderhalve eeuw de verbouwing van het Kasteel. Hendrik de Derde van Nassau en zijn (drede) vrouw Mencia de Mendoza hebben veel in Breda ver- toefd, maar verbleven dan toch bij voorkeur in de vertrekken boven de overigens al lang geleden gesloopte watermolen op het terrein van het Kasteel. Rechts van de poort bevindt zich het zgn. Blokhuis, de ambts- woning van de gouveneur van de KMA. Willem van Oranje woonde daar in een aangrenzende ruimte, maar Prins Maurits prefereerde de watermolen als dagelijks verblijf. Prins Philips Willem (1554-1618), de oudste en roomskatholieke zoon van Willem van Oranje, die vele jaren in Spaanse balling- schap verbleef en in Diest werd begraven, is de eerste Oranje geweest, die met zijn vrouw ook in het Kasteel ging wonen. Hij liet het park Valkenberg verfraaien en het Kasteel echt als een paleis inrichten. Bij zijn dood in 1618 werden in Breda tweeënveertig dagen achtereen de kerkklokken geluid. Op de plaats van de vensters, links en rechts van de poort, bevonden zich in de zestiende en zeventiende eeuw sierlijke open galerijen. Het muisgrijze gebouw links van de kasteelpoort werd gebouwd in 1867. Het maakt thans ook deel uit van het KMA gebouwen complex. Meer geschiedenis schuilt et achter de witte pui van het gebouw.</value>
</data>
@@ -117,6 +117,12 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="HBDescription" xml:space="preserve">
<value>Het Huis van Brecht is een van de meer historische gebouwen in Breda.</value>
</data>
<data name="HBName" xml:space="preserve">
<value>Huis van Brecht</value>
</data>
<data name="KBDescription" xml:space="preserve">
<value>Dit plein bevindt zich aan de zuiderzijde van het kasteel. U heeft zo een mooi uitzicht op de monumentale poort, de zgn. Stadhouderspoort met het wapen van stadhouder Willem de Vijfde, dat overigens pas later is aangebracht. Achter u ziet u het ruiterstandbeeld van stadhouder koning Willem III geplaatst. Voor dit standbeeld werd onder de burgerij van Breda een inzameling gehouden die f 47.000,-- opbracht. Voor de oude Nassaustad Breda is de stadhouderkoning van grote betekenis geweest. Hij voltooide na anderhalve eeuw de verbouwing van het Kasteel. Hendrik de Derde van Nassau en zijn (drede) vrouw Mencia de Mendoza hebben veel in Breda ver- toefd, maar verbleven dan toch bij voorkeur in de vertrekken boven de overigens al lang geleden gesloopte watermolen op het terrein van het Kasteel. Rechts van de poort bevindt zich het zgn. Blokhuis, de ambts- woning van de gouveneur van de KMA. Willem van Oranje woonde daar in een aangrenzende ruimte, maar Prins Maurits prefereerde de watermolen als dagelijks verblijf. Prins Philips Willem (1554-1618), de oudste en roomskatholieke zoon van Willem van Oranje, die vele jaren in Spaanse balling- schap verbleef en in Diest werd begraven, is de eerste Oranje geweest, die met zijn vrouw ook in het Kasteel ging wonen. Hij liet het park Valkenberg verfraaien en het Kasteel echt als een paleis inrichten. Bij zijn dood in 1618 werden in Breda tweeënveertig dagen achtereen de kerkklokken geluid. Op de plaats van de vensters, links en rechts van de poort, bevonden zich in de zestiende en zeventiende eeuw sierlijke open galerijen. Het muisgrijze gebouw links van de kasteelpoort werd gebouwd in 1867. Het maakt thans ook deel uit van het KMA gebouwen complex. Meer geschiedenis schuilt et achter de witte pui van het gebouw.</value>
</data>
+55 -3
View File
@@ -11,17 +11,69 @@ namespace NavCityBreda.ViewModels
{
public class MapVM : TemplateVM
{
//In een route de MapLegs gaan bijhouden. Dan de eerste als current instellen.
//Dan kan je daarvan de informatie laten zien. Ook een event toevoegen als je dan aan het einde bent, dat weet je door lon-lon > 0.? te doen elke positie update.
//Allemaal in RouteManager afhandelen
//Nog een manier vinden om van een route afwijken op te vangen en dan opnieuw de route te berekenen.
public MapVM() : base(Util.Loader.GetString("Map"))
{
App.RouteManager.OnManeuverChanged += RouteManager_OnManeuverChanged;
App.RouteManager.OnStatusUpdate += RouteManager_OnStatusUpdate;
}
protected override void UpdatePropertiesToNewLanguage()
{
NotifyPropertyChanged(nameof(Landmark));
NotifyPropertyChanged(nameof(Maneuver));
}
internal void UpdateMap()
private void RouteManager_OnStatusUpdate(object sender, Model.RouteStatusChangedEventArgs e)
{
dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
NotifyPropertyChanged(nameof(Instructions));
});
}
private void RouteManager_OnManeuverChanged(object sender, Model.ManeuverChangedEventArgs e)
{
dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
NotifyPropertyChanged(nameof(Landmark));
NotifyPropertyChanged(nameof(Maneuver));
});
}
public bool Instructions
{
get
{
return App.RouteManager.Status == Model.RouteManager.RouteStatus.STARTED;
}
}
public string Maneuver
{
get
{
if (App.RouteManager.CurrentManeuver != null)
return Util.TranslatedManeuver(App.RouteManager.CurrentManeuver);
else
return Util.Loader.GetString("Unknown");
}
}
public string Landmark
{
get
{
if (App.RouteManager.CurrentLandmark != null)
return App.RouteManager.CurrentLandmark.Name;
else
return Util.Loader.GetString("Unknown");
}
}
public void UpdateMap()
{
if(App.MainPage != null)
App.MainPage.Title = Util.Loader.GetString("Map");
+22 -12
View File
@@ -3,26 +3,36 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:NavCityBreda.Views"
xmlns:convert="using:NavCityBreda.Helpers"
xmlns:map="using:Windows.UI.Xaml.Controls.Maps"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<convert:BoolToVisibilityConverter x:Key="BoolConverter" />
</Page.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<map:MapControl Grid.Row="0" Name="Map" MapElementClick="Map_MapElementClick" ZoomInteractionMode="GestureAndControl" PedestrianFeaturesVisible="True" PanInteractionMode="Auto" TiltInteractionMode="ControlOnly" RotateInteractionMode="GestureAndControl" MapServiceToken="74Y70e71HVjjN7lnx4Eh~3wugTlBDe2DbPGuR_AM2aA~AjMbg-pU2qn4gYf97oH0GZI1oY9Jc4vH-4WyIRyoYQM0Q71CnfbWalEN37bdSgms">
<!-- <map:MapItemsControl x:Name="MapItems">
<Button x:Name="MapItemButton" Background="Transparent">
<StackPanel>
<Border Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" />
<Ellipse Margin="4" Width="40" Height="20" Fill="{ThemeResource ApplicationPageBackgroundThemeBrush}">
</Ellipse>
</StackPanel>
</Button>
</map:MapItemsControl> -->
</map:MapControl>
<StackPanel Grid.Row="0" Background="Gray" Visibility="{Binding Instructions, Converter={StaticResource BoolConverter}}">
<Viewbox StretchDirection="DownOnly" Stretch="UniformToFill" Margin="10,5,10,5">
<TextBlock FontSize="20" Text="{Binding Landmark}" Foreground="White" />
</Viewbox>
</StackPanel>
<map:MapControl Grid.Row="1" Name="Map" MapElementClick="Map_MapElementClick" ZoomInteractionMode="GestureAndControl" PedestrianFeaturesVisible="True" PanInteractionMode="Auto" TiltInteractionMode="ControlOnly" RotateInteractionMode="GestureAndControl" MapServiceToken="74Y70e71HVjjN7lnx4Eh~3wugTlBDe2DbPGuR_AM2aA~AjMbg-pU2qn4gYf97oH0GZI1oY9Jc4vH-4WyIRyoYQM0Q71CnfbWalEN37bdSgms" />
<StackPanel Grid.Row="2" Background="LightGray" Visibility="{Binding Instructions, Converter={StaticResource BoolConverter}}">
<Viewbox StretchDirection="DownOnly" Stretch="UniformToFill" Margin="10,5,10,5">
<TextBlock FontSize="14" Text="{Binding Maneuver}" />
</Viewbox>
</StackPanel>
</Grid>
</Page>
+48 -16
View File
@@ -45,6 +45,7 @@ namespace NavCityBreda.Views
this.NavigationCacheMode = NavigationCacheMode.Enabled;
mapvm = new MapVM();
this.DataContext = mapvm;
CurrentPosition = new MapIcon();
CurrentPosition.NormalizedAnchorPoint = new Point(0.5, 0.5);
@@ -53,19 +54,26 @@ namespace NavCityBreda.Views
CurrentPosition.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/CurrentLocationRound.png"));
Map.MapElements.Add(CurrentPosition);
CurrentNavigationLine = new MapPolyline() { StrokeColor = Color.FromArgb(255, 255, 100, 100), StrokeThickness = 6, ZIndex = 20 };
CurrentNavigationLine = new MapPolyline() { StrokeColor = Color.FromArgb(255, 255, 100, 100), StrokeThickness = 6, ZIndex = 100 };
//Map.MapElements.Add(CurrentNavigationLine);
App.Geo.OnPositionUpdate += Geo_OnPositionUpdate;
App.RouteManager.OnStatusUpdate += RouteManager_OnStatusUpdate;
App.RouteManager.OnRouteChanged += RouteManager_OnRouteChanged;
App.RouteManager.OnLandmarkChanged += RouteManager_OnLandmarkChanged;
App.RouteManager.OnLandmarkVisited += RouteManager_OnLandmarkVisited;
App.CompassTracker.OnSlowHeadingUpdated += CompassTracker_OnHeadingUpdated;
Settings.OnLanguageUpdate += Settings_OnLanguageUpdate;
}
private void Settings_OnLanguageUpdate(EventArgs e)
{
DrawRoute();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
mapvm.UpdateMap();
App.Geo.TryConnectIfNull();
}
private void CompassTracker_OnHeadingUpdated(object sender, HeadingUpdatedEventArgs e)
@@ -87,13 +95,14 @@ namespace NavCityBreda.Views
});
}
private void RouteManager_OnRouteChanged(object sender, RouteChangedEventArgs e)
private void RouteManager_OnLandmarkChanged(object sender, LandmarkChangedEventArgs e)
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
Map.MapElements.Remove(CurrentNavigationLine);
CurrentNavigationLine.Path = e.Route.Path;
Map.MapElements.Add(CurrentNavigationLine);
if (!Map.MapElements.Contains(CurrentNavigationLine))
Map.MapElements.Add(CurrentNavigationLine);
});
}
@@ -103,7 +112,7 @@ namespace NavCityBreda.Views
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
MapPolyline linebit = Util.GetRouteLine(e.Old.Coordinate.Point.Position, e.New.Coordinate.Point.Position, Color.FromArgb(255, 155, 155, 155));
MapPolyline linebit = Util.GetRouteLine(e.Old.Coordinate.Point.Position, e.New.Coordinate.Point.Position, Color.FromArgb(255, 155, 155, 155), 250, 6);
Map.MapElements.Add(linebit);
});
}
@@ -127,22 +136,27 @@ namespace NavCityBreda.Views
private void DrawRoute()
{
if (App.RouteManager.Status != RouteManager.RouteStatus.STARTED) return;
Route r = App.RouteManager.CurrentRoute;
Settings.Tracking = false;
if (r == null) return;
GeofenceMonitor.Current.Geofences.Clear();
Map.MapElements.Clear();
Map.MapElements.Add(CurrentPosition);
Map.MapElements.Add(CurrentNavigationLine);
Map.MapElements.Add(Util.GetRouteLine(App.Geo.History.Select(p => p.Coordinate.Point.Position).ToList(), Color.FromArgb(255, 155, 155, 155), 250, 6));
foreach(Landmark l in r.Landmarks)
foreach (Landmark l in r.Landmarks)
{
GeofenceMonitor.Current.Geofences.Add(new Geofence(l.Id, new Geocircle(l.Location.Position, 40)));
l.UpdateIconImage();
if (!l.Visited)
GeofenceMonitor.Current.Geofences.Add(new Geofence(l.Id, new Geocircle(l.Location.Position, 35), MonitoredGeofenceStates.Entered, true));
l.UpdateIcon();
Map.MapElements.Add(l.Icon);
}
Map.MapElements.Add(Util.GetRouteLine(App.RouteManager.CurrentRoute.RouteObject, Color.FromArgb(200, 100, 100, 255), 3));
Map.MapElements.Add(Util.GetRouteLine(App.RouteManager.CurrentRoute.RouteObject, Color.FromArgb(200, 100, 100, 255), 50, 3));
ZoomRoute();
}
@@ -164,18 +178,36 @@ namespace NavCityBreda.Views
Zoom();
}
private async void Zoom()
private async Task<String> Zoom()
{
await Task.Delay(TimeSpan.FromSeconds(1));
await Map.TrySetViewAsync(CurrentPosition.Location, 15);
await Task.Delay(TimeSpan.FromMilliseconds(500));
await Map.TrySetViewAsync(CurrentPosition.Location, 17);
if(App.RouteManager.Status == RouteManager.RouteStatus.STARTED)
{
await Task.Delay(TimeSpan.FromMilliseconds(500));
await Map.TryTiltToAsync(40);
}
else
{
await Task.Delay(TimeSpan.FromMilliseconds(500));
await Map.TryTiltToAsync(0);
}
return "";
}
private async void ZoomRoute()
{
await Task.Delay(TimeSpan.FromSeconds(1));
Settings.Tracking = false;
await Task.Delay(TimeSpan.FromMilliseconds(500));
await Map.TrySetViewBoundsAsync(App.RouteManager.CurrentRoute.Bounds, null, Windows.UI.Xaml.Controls.Maps.MapAnimationKind.Linear);
await Task.Delay(TimeSpan.FromSeconds(1));
await Task.Delay(TimeSpan.FromMilliseconds(500));
await Map.TryRotateToAsync(0);
await Task.Delay(TimeSpan.FromMilliseconds(1500));
await Zoom();
await Task.Delay(TimeSpan.FromMilliseconds(500));
await Map.TryRotateToAsync((double)App.CompassTracker.Heading.HeadingTrueNorth);
Settings.Tracking = true;
}
private void Map_MapElementClick(MapControl sender, MapElementClickEventArgs args)
+14 -3
View File
@@ -37,6 +37,12 @@ namespace NavCityBreda.Views
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Enabled;
Settings.OnLanguageUpdate += Settings_OnLanguageUpdate;
}
private void Settings_OnLanguageUpdate(EventArgs e)
{
DrawRoute();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
@@ -54,23 +60,28 @@ namespace NavCityBreda.Views
routedetailvm = new RouteDetailVM(route);
this.DataContext = routedetailvm;
DrawRoute();
}
private async void DrawRoute()
{
Map.MapElements.Clear();
Zoom();
MapPolyline m = Util.GetRouteLine(route.RouteObject, Color.FromArgb(255, 100, 100, 255));
MapPolyline m = Util.GetRouteLine(route.RouteObject, Color.FromArgb(255, 100, 100, 255), 25, 6);
Map.MapElements.Add(m);
foreach (Landmark l in route.Landmarks)
{
l.UpdateIconImage();
l.UpdateIcon();
Map.MapElements.Add(l.Icon);
}
}
private async void Zoom()
{
await Task.Delay(TimeSpan.FromSeconds(1));
await Task.Delay(TimeSpan.FromMilliseconds(500));
await Map.TrySetViewBoundsAsync(route.Bounds, null, Windows.UI.Xaml.Controls.Maps.MapAnimationKind.None);
}
+1 -1
View File
@@ -11,7 +11,7 @@
<ListView x:Name="RouteList" ItemsSource="{Binding Routes}" Margin="0,10,0,0" IsItemClickEnabled="True" ItemClick="RouteList_ItemClick" RelativePanel.AlignBottomWithPanel="True" RelativePanel.AlignTopWithPanel="True" RelativePanel.AlignLeftWithPanel="True" RelativePanel.AlignRightWithPanel="True">
<ListView.ItemTemplate>
<DataTemplate x:Name="ListViewDataTemplate">
<StackPanel Margin="5,0,0,0" Grid.Column="0">
<StackPanel Margin="5,0,0,0">
<TextBlock Text="{Binding Name}" FontSize="20" TextWrapping="NoWrap"/>
<TextBlock Text="{Binding LandmarksDescription}" FontSize="14" TextWrapping="WrapWholeWords" />
</StackPanel>
+1
View File
@@ -41,6 +41,7 @@ namespace NavCityBreda.Views
{
default:
Debug.WriteLine("Unsupported language: " + Settings.CurrentLanguage);
Language.SelectedIndex = 0;
break;
case "en":
Language.SelectedIndex = 0;