Added geofencing (untested). Improved route handling
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
@@ -23,7 +23,7 @@ namespace NavCityBreda.Helpers
|
|||||||
if (!ValidateRouteObject(o, out error))
|
if (!ValidateRouteObject(o, out error))
|
||||||
throw new FileLoadException("Invalid Route information in " + file + ", " + error);
|
throw new FileLoadException("Invalid Route information in " + file + ", " + error);
|
||||||
|
|
||||||
Route r = new Route((string)o["name"], (string)o["description"], (string)o["landmarks"], Int32.Parse((string)o["minutes"]));
|
Route r = new Route((string)o["name"], (string)o["description"], (string)o["landmarks"]);
|
||||||
|
|
||||||
JToken[] waypoints = o["waypoints"].ToArray();
|
JToken[] waypoints = o["waypoints"].ToArray();
|
||||||
int count = 0;
|
int count = 0;
|
||||||
@@ -69,12 +69,6 @@ namespace NavCityBreda.Helpers
|
|||||||
error = "Landmarks missing";
|
error = "Landmarks missing";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (o["minutes"].NullOrEmpty())
|
|
||||||
{
|
|
||||||
valid = false;
|
|
||||||
error = "Minutes missing";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (o["waypoints"].NullOrEmpty())
|
if (o["waypoints"].NullOrEmpty())
|
||||||
{
|
{
|
||||||
valid = false;
|
valid = false;
|
||||||
|
|||||||
@@ -157,5 +157,39 @@ namespace NavCityBreda.Helpers
|
|||||||
|
|
||||||
return line;
|
return line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MapPolyline GetRouteLine(List<BasicGeoposition> positions, Color color, int thickness = 10, bool dashed = false)
|
||||||
|
{
|
||||||
|
var line = new MapPolyline
|
||||||
|
{
|
||||||
|
StrokeThickness = thickness,
|
||||||
|
StrokeColor = color,
|
||||||
|
StrokeDashed = dashed,
|
||||||
|
ZIndex = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
line.Path = new Geopath(positions);
|
||||||
|
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MapPolyline GetRouteLine(BasicGeoposition p1, BasicGeoposition p2, Color color, int thickness = 10, bool dashed = false)
|
||||||
|
{
|
||||||
|
var line = new MapPolyline
|
||||||
|
{
|
||||||
|
StrokeThickness = thickness,
|
||||||
|
StrokeColor = color,
|
||||||
|
StrokeDashed = dashed,
|
||||||
|
ZIndex = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
List<BasicGeoposition> plist = new List<BasicGeoposition>();
|
||||||
|
plist.Add(p1);
|
||||||
|
plist.Add(p2);
|
||||||
|
|
||||||
|
line.Path = new Geopath(plist);
|
||||||
|
|
||||||
|
return line;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Windows.Devices.Geolocation;
|
using Windows.Devices.Geolocation;
|
||||||
|
using Windows.Devices.Geolocation.Geofencing;
|
||||||
using Windows.Foundation;
|
using Windows.Foundation;
|
||||||
using Windows.System;
|
using Windows.System;
|
||||||
|
|
||||||
@@ -56,8 +57,8 @@ namespace NavCityBreda.Model
|
|||||||
case GeolocationAccessStatus.Allowed:
|
case GeolocationAccessStatus.Allowed:
|
||||||
geo = new Geolocator {
|
geo = new Geolocator {
|
||||||
DesiredAccuracy = PositionAccuracy.High,
|
DesiredAccuracy = PositionAccuracy.High,
|
||||||
//MovementThreshold = 1
|
//MovementThreshold = 5
|
||||||
ReportInterval = 5000
|
ReportInterval = 1500
|
||||||
};
|
};
|
||||||
|
|
||||||
Connected = true;
|
Connected = true;
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Windows.Devices.Geolocation;
|
using Windows.Devices.Geolocation;
|
||||||
|
using Windows.Foundation;
|
||||||
|
using Windows.Storage.Streams;
|
||||||
|
using Windows.UI.Xaml.Controls.Maps;
|
||||||
|
|
||||||
namespace NavCityBreda.Model
|
namespace NavCityBreda.Model
|
||||||
{
|
{
|
||||||
@@ -13,25 +16,54 @@ namespace NavCityBreda.Model
|
|||||||
{
|
{
|
||||||
public string Description { get; private set; }
|
public string Description { get; private set; }
|
||||||
public string Image { get; private set; }
|
public string Image { get; private set; }
|
||||||
public bool Visited { get; set; }
|
|
||||||
|
private bool _visited;
|
||||||
|
public bool Visited
|
||||||
|
{
|
||||||
|
get { return _visited; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_visited = value;
|
||||||
|
UpdateIconImage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Id { get; private set; }
|
||||||
|
public MapIcon Icon { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public Landmark(Geopoint p, string name, string desc, int num, string image_loc = "default.jpg") : base (p, name, num)
|
public Landmark(Geopoint p, string name, string desc, int num, string image_loc = "default.jpg") : base (p, name, num)
|
||||||
{
|
{
|
||||||
Visited = false;
|
Create(Location, name, desc, num, image_loc);
|
||||||
Description = desc;
|
|
||||||
if (image_loc == "" || !File.Exists(Util.RouteImagesFolder + image_loc))
|
|
||||||
image_loc = "default.jpg";
|
|
||||||
Image = "/" + Util.RouteImagesFolder + image_loc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Landmark(double la, double lo, string name, string desc, int num, string image_loc = "default.jpg") : base(la, lo, name, num)
|
public Landmark(double la, double lo, string name, string desc, int num, string image_loc = "default.jpg") : base(la, lo, name, num)
|
||||||
{
|
{
|
||||||
Visited = false;
|
Create(Location, name, desc, num, image_loc);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Create(Geopoint p, string name, string desc, int num, string image_loc)
|
||||||
|
{
|
||||||
|
_visited = false;
|
||||||
Description = desc;
|
Description = desc;
|
||||||
if (image_loc == "" || !File.Exists(Util.RouteImagesFolder + image_loc))
|
if (image_loc == "" || !File.Exists(Util.RouteImagesFolder + image_loc))
|
||||||
image_loc = "default.jpg";
|
image_loc = "default.jpg";
|
||||||
Image = "/" + Util.RouteImagesFolder + image_loc;
|
Image = "/" + Util.RouteImagesFolder + image_loc;
|
||||||
|
Id = Name + "_" + Order;
|
||||||
|
|
||||||
|
Icon = new MapIcon();
|
||||||
|
Icon.Location = Location;
|
||||||
|
Icon.NormalizedAnchorPoint = new Point(0.5, 1.0);
|
||||||
|
Icon.Title = Name;
|
||||||
|
Icon.ZIndex = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateIconImage()
|
||||||
|
{
|
||||||
|
if(_visited)
|
||||||
|
Icon.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/LandmarkVisited.png"));
|
||||||
|
else
|
||||||
|
Icon.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/LandmarkNotVisited.png"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,8 +17,15 @@ namespace NavCityBreda.Model
|
|||||||
|
|
||||||
public string Name { get; private set; }
|
public string Name { get; private set; }
|
||||||
public string Description { get; private set; }
|
public string Description { get; private set; }
|
||||||
public string Landmarks { get; private set; }
|
public string LandmarksDescription { get; private set; }
|
||||||
public int Minutes { get; private set; }
|
|
||||||
|
public List<Landmark> Landmarks
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _waypoints.Where(l => l is Landmark).Cast<Landmark>().ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private List<Waypoint> _waypoints;
|
private List<Waypoint> _waypoints;
|
||||||
public List<Waypoint> Waypoints { get { return _waypoints; } }
|
public List<Waypoint> Waypoints { get { return _waypoints; } }
|
||||||
@@ -26,12 +33,11 @@ namespace NavCityBreda.Model
|
|||||||
private MapRoute _route;
|
private MapRoute _route;
|
||||||
public MapRoute RouteObject { get { return _route; } }
|
public MapRoute RouteObject { get { return _route; } }
|
||||||
|
|
||||||
public Route(string name, string desc, string landmarks, int minutes)
|
public Route(string name, string desc, string landmarks)
|
||||||
{
|
{
|
||||||
Name = name;
|
Name = name;
|
||||||
Description = desc;
|
Description = desc;
|
||||||
Landmarks = landmarks;
|
LandmarksDescription = landmarks;
|
||||||
Minutes = minutes;
|
|
||||||
_waypoints = new List<Waypoint>();
|
_waypoints = new List<Waypoint>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,7 +69,12 @@ namespace NavCityBreda.Model
|
|||||||
public async Task<String> CalculateRoute()
|
public async Task<String> CalculateRoute()
|
||||||
{
|
{
|
||||||
_route = await Util.FindWalkingRoute(_waypoints.Select(p => p.Location).ToList());
|
_route = await Util.FindWalkingRoute(_waypoints.Select(p => p.Location).ToList());
|
||||||
return "";
|
return "success";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reset()
|
||||||
|
{
|
||||||
|
Landmarks.ForEach(l => l.Visited = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,12 @@ namespace NavCityBreda.Model
|
|||||||
{
|
{
|
||||||
public class RouteManager
|
public class RouteManager
|
||||||
{
|
{
|
||||||
|
public delegate void StatusUpdateHandler(object sender, RouteStatusChangedEventArgs e);
|
||||||
|
public event StatusUpdateHandler OnStatusUpdate;
|
||||||
|
|
||||||
|
public delegate void PositionUpdateHandler(object sender, RoutePositionChangedEventArgs e);
|
||||||
|
public event PositionUpdateHandler OnPositionUpdate;
|
||||||
|
|
||||||
private List<Route> _routes;
|
private List<Route> _routes;
|
||||||
public List<Route> Routes { get { return _routes; } }
|
public List<Route> Routes { get { return _routes; } }
|
||||||
|
|
||||||
@@ -34,16 +40,20 @@ namespace NavCityBreda.Model
|
|||||||
public RouteManager()
|
public RouteManager()
|
||||||
{
|
{
|
||||||
_routes = new List<Route>();
|
_routes = new List<Route>();
|
||||||
|
_history = new List<Geoposition>();
|
||||||
LoadingElement = "Initializing...";
|
LoadingElement = "Initializing...";
|
||||||
RouteState = State.STOPPED;
|
|
||||||
LoadRoutes();
|
|
||||||
App.Geo.PositionChanged += Geo_PositionChanged;
|
App.Geo.PositionChanged += Geo_PositionChanged;
|
||||||
|
RouteState = State.STOPPED;
|
||||||
|
LoadRoutes();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Geo_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
|
private void Geo_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
|
||||||
{
|
{
|
||||||
if (RouteState == State.STARTED)
|
if (RouteState == State.STARTED)
|
||||||
|
{
|
||||||
|
OnPositionUpdate(this, new RoutePositionChangedEventArgs(_history.Last(), args.Position));
|
||||||
_history.Add(args.Position);
|
_history.Add(args.Position);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void LoadRoutes()
|
private async void LoadRoutes()
|
||||||
@@ -63,21 +73,54 @@ namespace NavCityBreda.Model
|
|||||||
LoadingElement = "Done";
|
LoadingElement = "Done";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdateStatus(State status)
|
||||||
|
{
|
||||||
|
RouteState = status;
|
||||||
|
// Make sure someone is listening to event
|
||||||
|
if (OnStatusUpdate == null) return;
|
||||||
|
|
||||||
|
OnStatusUpdate(this, new RouteStatusChangedEventArgs(status));
|
||||||
|
}
|
||||||
|
|
||||||
public void StartRoute(Route r)
|
public void StartRoute(Route r)
|
||||||
{
|
{
|
||||||
_currentroute = r;
|
_currentroute = r;
|
||||||
RouteState = State.STARTED;
|
_history.Add(App.Geo.Position);
|
||||||
|
UpdateStatus(State.STARTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StopRoute()
|
public void StopRoute()
|
||||||
{
|
{
|
||||||
if (RouteState == State.STARTED)
|
if (RouteState == State.STARTED)
|
||||||
{
|
{
|
||||||
|
_currentroute.Reset();
|
||||||
_currentroute = null;
|
_currentroute = null;
|
||||||
RouteState = State.STOPPED;
|
UpdateStatus(State.STOPPED);
|
||||||
}
|
}
|
||||||
|
|
||||||
_history.Clear();
|
_history.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class RouteStatusChangedEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public RouteManager.State Status { get; private set; }
|
||||||
|
|
||||||
|
public RouteStatusChangedEventArgs(RouteManager.State status)
|
||||||
|
{
|
||||||
|
Status = status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RoutePositionChangedEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public Geoposition Old { get; private set; }
|
||||||
|
public Geoposition New { get; private set; }
|
||||||
|
|
||||||
|
public RoutePositionChangedEventArgs(Geoposition old, Geoposition notold)
|
||||||
|
{
|
||||||
|
Old = old;
|
||||||
|
New = notold;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<OutputPath>bin\ARM\Debug\</OutputPath>
|
<OutputPath>bin\ARM\Debug\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
<NoWarn>;2008</NoWarn>
|
<NoWarn>2008;CS4014</NoWarn>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<PlatformTarget>ARM</PlatformTarget>
|
<PlatformTarget>ARM</PlatformTarget>
|
||||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
|
||||||
<NoWarn>;2008</NoWarn>
|
<NoWarn>2008;CS4014;</NoWarn>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
@@ -90,6 +90,18 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->
|
<!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->
|
||||||
|
<Content Include="Assets\CurrentLocationArrow.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Assets\CurrentLocationRound.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Assets\LandmarkNotVisited.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Assets\LandmarkVisited.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="Assets\SplashScreen.scale-100.png">
|
<Content Include="Assets\SplashScreen.scale-100.png">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
@@ -99,12 +111,6 @@
|
|||||||
<Content Include="Routes\Waypoints\historische_kilometer.json">
|
<Content Include="Routes\Waypoints\historische_kilometer.json">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="Routes\Waypoints\test_route_1.json">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="Routes\Waypoints\test_route_2.json">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<PRIResource Include="Strings\ja-JP\Resources.resw" />
|
<PRIResource Include="Strings\ja-JP\Resources.resw" />
|
||||||
<PRIResource Include="Strings\de-DE\Resources.resw" />
|
<PRIResource Include="Strings\de-DE\Resources.resw" />
|
||||||
<PRIResource Include="Strings\nl-NL\Resources.resw" />
|
<PRIResource Include="Strings\nl-NL\Resources.resw" />
|
||||||
@@ -135,7 +141,6 @@
|
|||||||
<Compile Include="Model\RouteManager.cs" />
|
<Compile Include="Model\RouteManager.cs" />
|
||||||
<Compile Include="Model\Waypoint.cs" />
|
<Compile Include="Model\Waypoint.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="ViewModel\MapVM.cs" />
|
|
||||||
<Compile Include="ViewModel\MenuVM.cs" />
|
<Compile Include="ViewModel\MenuVM.cs" />
|
||||||
<Compile Include="ViewModel\RouteDetailVM.cs" />
|
<Compile Include="ViewModel\RouteDetailVM.cs" />
|
||||||
<Compile Include="ViewModel\RouteVM.cs" />
|
<Compile Include="ViewModel\RouteVM.cs" />
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"name": "Historische kilometer",
|
"name": "Historische kilometer",
|
||||||
"description": "De historische kilometer door Breda",
|
"description": "De historische kilometer door Breda",
|
||||||
"landmarks": "Kasteel van Breda, Grote Kerk, Stadhuis",
|
"landmarks": "Kasteel van Breda, Grote Kerk, Stadhuis",
|
||||||
"minutes": 205,
|
|
||||||
"waypoints": [
|
"waypoints": [
|
||||||
{
|
{
|
||||||
"name": "VVV",
|
"name": "VVV",
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Test route 1",
|
|
||||||
"description": "Dit is een route om van alles mee te testen!\nHopelijk staat dit op een nieuwe regel.\n\rAnders dit.\r\nAnders dit 2.<br>Misschien dit.",
|
|
||||||
"landmarks": "Een stad, een bos en een meertje. Dit moet eigenlijk vrij kort zijn.",
|
|
||||||
"minutes": 15,
|
|
||||||
"waypoints": [
|
|
||||||
{
|
|
||||||
"name": "Test locatie 1",
|
|
||||||
"landmark": true,
|
|
||||||
"description": "Test locatie 1",
|
|
||||||
"latitude": 51.594112,
|
|
||||||
"longitude": 4.779417
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"name": "Test locatie 2",
|
|
||||||
"landmark": true,
|
|
||||||
"description": "Test locatie 2",
|
|
||||||
"latitude": 51.593278,
|
|
||||||
"longitude": 4.779388
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Test locatie 3",
|
|
||||||
"landmark": false,
|
|
||||||
"latitude": 51.5925,
|
|
||||||
"longitude": 4.779695
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Test locatie 4",
|
|
||||||
"landmark": false,
|
|
||||||
"latitude": 51.5925,
|
|
||||||
"longitude": 4.779388
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Test locatie 5",
|
|
||||||
"landmark": true,
|
|
||||||
"description": "Test locatie 5",
|
|
||||||
"latitude": 51.592833,
|
|
||||||
"longitude": 4.778472
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Test route 2",
|
|
||||||
"description": "Dit is een route om van alles mee te testen!\nHopelijk staat dit op een nieuwe regel.\n\rAnders dit.\r\nAnders dit 2.<br>Misschien dit.",
|
|
||||||
"landmarks": "Een stad, een bos en een meertje. Dit moet eigenlijk vrij kort zijn.",
|
|
||||||
"minutes": 400,
|
|
||||||
"waypoints": [
|
|
||||||
{
|
|
||||||
"name": "Test locatie 6",
|
|
||||||
"landmark": true,
|
|
||||||
"description": "Test locatie 1",
|
|
||||||
"latitude": 51.594112,
|
|
||||||
"longitude": 4.779417
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"name": "Test locatie 7",
|
|
||||||
"landmark": true,
|
|
||||||
"description": "Test locatie 2",
|
|
||||||
"latitude": 51.593278,
|
|
||||||
"longitude": 4.779388
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Test locatie 8",
|
|
||||||
"landmark": false,
|
|
||||||
"latitude": 51.5925,
|
|
||||||
"longitude": 4.779695
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Test locatie 9",
|
|
||||||
"landmark": false,
|
|
||||||
"latitude": 51.5925,
|
|
||||||
"longitude": 4.779388
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Test locatie 10",
|
|
||||||
"landmark": true,
|
|
||||||
"description": "Test locatie 5",
|
|
||||||
"latitude": 51.592833,
|
|
||||||
"longitude": 4.778472
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Windows.Devices.Geolocation;
|
|
||||||
using Windows.UI.Core;
|
|
||||||
|
|
||||||
namespace NavCityBreda.ViewModel
|
|
||||||
{
|
|
||||||
class MapVM : INotifyPropertyChanged
|
|
||||||
{
|
|
||||||
CoreDispatcher dispatcher;
|
|
||||||
|
|
||||||
public MapVM()
|
|
||||||
{
|
|
||||||
dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;
|
|
||||||
App.Geo.StatusChanged += Geo_StatusChanged;
|
|
||||||
App.Geo.PositionChanged += Geo_PositionChanged;
|
|
||||||
}
|
|
||||||
|
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
|
||||||
|
|
||||||
private void NotifyPropertyChanged(string propertyName)
|
|
||||||
{
|
|
||||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Geo_StatusChanged(Geolocator sender, StatusChangedEventArgs args)
|
|
||||||
{
|
|
||||||
dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
|
|
||||||
{
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Geo_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
|
|
||||||
{
|
|
||||||
dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
|
|
||||||
{
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -34,11 +34,6 @@ namespace NavCityBreda.ViewModel
|
|||||||
{
|
{
|
||||||
TimeSpan length = route.RouteObject.EstimatedDuration;
|
TimeSpan length = route.RouteObject.EstimatedDuration;
|
||||||
return length.Hours + "h " + length.Minutes + "m";
|
return length.Hours + "h " + length.Minutes + "m";
|
||||||
|
|
||||||
//int hours = route.Minutes / 60;
|
|
||||||
//int minutes = route.Minutes % 60;
|
|
||||||
|
|
||||||
//return hours + "h " + minutes + "m";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +60,7 @@ namespace NavCityBreda.ViewModel
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return route.Waypoints.Where(p => p is Landmark).Cast<Landmark>().ToList();
|
return route.Landmarks;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,6 +84,7 @@ namespace NavCityBreda.ViewModel
|
|||||||
{
|
{
|
||||||
NotifyPropertyChanged(nameof(StartEnabled));
|
NotifyPropertyChanged(nameof(StartEnabled));
|
||||||
NotifyPropertyChanged(nameof(StopEnabled));
|
NotifyPropertyChanged(nameof(StopEnabled));
|
||||||
|
NotifyPropertyChanged(nameof(Landmarks));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ using System.Diagnostics;
|
|||||||
using NavCityBreda.Helpers;
|
using NavCityBreda.Helpers;
|
||||||
using Windows.UI;
|
using Windows.UI;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Windows.Storage;
|
||||||
|
using Windows.Devices.Geolocation.Geofencing;
|
||||||
|
using Windows.UI.Core;
|
||||||
|
|
||||||
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
|
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
|
||||||
|
|
||||||
@@ -38,56 +41,101 @@ namespace NavCityBreda.Views
|
|||||||
this.InitializeComponent();
|
this.InitializeComponent();
|
||||||
this.NavigationCacheMode = NavigationCacheMode.Enabled;
|
this.NavigationCacheMode = NavigationCacheMode.Enabled;
|
||||||
|
|
||||||
this.DataContext = new MapVM();
|
|
||||||
|
|
||||||
CurrentPosition = new MapIcon();
|
CurrentPosition = new MapIcon();
|
||||||
CurrentPosition.NormalizedAnchorPoint = new Point(0.5, 1.0);
|
CurrentPosition.NormalizedAnchorPoint = new Point(0.5, 0.5);
|
||||||
CurrentPosition.Title = "Current Position";
|
CurrentPosition.Title = "";
|
||||||
CurrentPosition.ZIndex = 999;
|
CurrentPosition.ZIndex = 999;
|
||||||
|
CurrentPosition.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/CurrentLocationRound.png"));
|
||||||
Map.MapElements.Add(CurrentPosition);
|
Map.MapElements.Add(CurrentPosition);
|
||||||
|
|
||||||
App.Geo.PositionChanged += Geo_PositionChanged;
|
App.Geo.PositionChanged += Geo_PositionChanged;
|
||||||
|
GeofenceMonitor.Current.GeofenceStateChanged += Current_GeofenceStateChanged;
|
||||||
|
App.RouteManager.OnPositionUpdate += RouteManager_OnPositionUpdate;
|
||||||
|
App.RouteManager.OnStatusUpdate += RouteManager_OnStatusUpdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnNavigatedTo(NavigationEventArgs e)
|
private void Current_GeofenceStateChanged(GeofenceMonitor sender, object args)
|
||||||
{
|
{
|
||||||
if (App.RouteManager.CurrentRoute != null)
|
var reports = sender.ReadReports();
|
||||||
DrawRoute();
|
|
||||||
else
|
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
|
||||||
{
|
{
|
||||||
Map.MapElements.Clear();
|
foreach (GeofenceStateChangeReport report in reports)
|
||||||
Map.MapElements.Add(CurrentPosition);
|
{
|
||||||
}
|
GeofenceState state = report.NewState;
|
||||||
|
Geofence geofence = report.Geofence;
|
||||||
|
|
||||||
|
if (state == GeofenceState.Removed)
|
||||||
|
{
|
||||||
|
GeofenceMonitor.Current.Geofences.Remove(geofence);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (state == GeofenceState.Entered)
|
||||||
|
{
|
||||||
|
Landmark i = App.RouteManager.CurrentRoute.Landmarks.Where(t => t.Id == geofence.Id).First();
|
||||||
|
i.Visited = true;
|
||||||
|
Util.MainPage.Navigate(typeof(LandmarkView), i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RouteManager_OnPositionUpdate(object sender, RoutePositionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
|
||||||
|
{
|
||||||
|
MapPolyline linebit = Util.GetRouteLine(e.Old.Coordinate.Point.Position, e.New.Coordinate.Point.Position, Color.FromArgb(255, 155, 155, 155));
|
||||||
|
Map.MapElements.Add(linebit);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RouteManager_OnStatusUpdate(object sender, RouteStatusChangedEventArgs e)
|
||||||
|
{
|
||||||
|
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
|
||||||
|
{
|
||||||
|
if (e.Status == RouteManager.State.STARTED)
|
||||||
|
DrawRoute();
|
||||||
|
else
|
||||||
|
RemoveRoute();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Geo_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
|
||||||
|
{
|
||||||
|
Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
|
||||||
|
{
|
||||||
|
DrawCurrenPosition(args.Position.Coordinate.Point);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawRoute()
|
private void DrawRoute()
|
||||||
{
|
{
|
||||||
Route r = App.RouteManager.CurrentRoute;
|
Route r = App.RouteManager.CurrentRoute;
|
||||||
|
|
||||||
|
Settings.LOCAL_SETTINGS.Values["track"] = false;
|
||||||
|
|
||||||
|
GeofenceMonitor.Current.Geofences.Clear();
|
||||||
Map.MapElements.Clear();
|
Map.MapElements.Clear();
|
||||||
Map.MapElements.Add(CurrentPosition);
|
Map.MapElements.Add(CurrentPosition);
|
||||||
|
|
||||||
foreach(Landmark l in r.Waypoints.Where(l => l is Landmark))
|
foreach(Landmark l in r.Landmarks)
|
||||||
{
|
{
|
||||||
MapIcon m = new MapIcon();
|
GeofenceMonitor.Current.Geofences.Add(new Geofence(l.Id, new Geocircle(l.Location.Position, 10)));
|
||||||
m.Location = l.Location;
|
l.UpdateIconImage();
|
||||||
m.NormalizedAnchorPoint = new Point(0.5, 1.0);
|
Map.MapElements.Add(l.Icon);
|
||||||
m.Title = l.Name;
|
|
||||||
m.ZIndex = 10;
|
|
||||||
Map.MapElements.Add(m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Map.MapElements.Add(Util.GetRouteLine(App.RouteManager.CurrentRoute.RouteObject, Color.FromArgb(255, 100, 100, 255)));
|
Map.MapElements.Add(Util.GetRouteLine(App.RouteManager.CurrentRoute.RouteObject, Color.FromArgb(200, 100, 100, 255)));
|
||||||
|
|
||||||
ZoomRoute();
|
ZoomRoute();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Geo_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
|
private void RemoveRoute()
|
||||||
{
|
{
|
||||||
Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
|
Settings.LOCAL_SETTINGS.Values["track"] = true;
|
||||||
{
|
Map.MapElements.Clear();
|
||||||
DrawCurrenPosition(new Geopoint(args.Position.Coordinate.Point.Position));
|
DrawCurrenPosition(App.Geo.Position.Coordinate.Point);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawCurrenPosition(Geopoint p)
|
private void DrawCurrenPosition(Geopoint p)
|
||||||
|
|||||||
@@ -55,19 +55,22 @@ namespace NavCityBreda.Views
|
|||||||
this.DataContext = vm;
|
this.DataContext = vm;
|
||||||
Util.MainPage.Title = route.Name;
|
Util.MainPage.Title = route.Name;
|
||||||
|
|
||||||
|
Map.MapElements.Clear();
|
||||||
|
|
||||||
Zoom();
|
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));
|
||||||
Map.MapElements.Add(m);
|
Map.MapElements.Add(m);
|
||||||
|
|
||||||
foreach (Landmark l in route.Waypoints.Where(l => l is Landmark))
|
Random rand = new Random();
|
||||||
|
|
||||||
|
foreach (Landmark l in route.Landmarks)
|
||||||
{
|
{
|
||||||
MapIcon mi = new MapIcon();
|
int randint = rand.Next(0,20);
|
||||||
mi.Location = l.Location;
|
if (randint > 15)
|
||||||
mi.NormalizedAnchorPoint = new Point(0.5, 1.0);
|
l.Visited = true;
|
||||||
mi.Title = "";
|
l.UpdateIconImage();
|
||||||
mi.ZIndex = 10;
|
Map.MapElements.Add(l.Icon);
|
||||||
Map.MapElements.Add(mi);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,7 +94,7 @@ namespace NavCityBreda.Views
|
|||||||
|
|
||||||
private void StopRouteButton_Click(object sender, RoutedEventArgs e)
|
private void StopRouteButton_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
App.RouteManager.StartRoute(null);
|
App.RouteManager.StopRoute();
|
||||||
Util.MainPage.Navigate(typeof(MapView));
|
Util.MainPage.Navigate(typeof(MapView));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<DataTemplate x:Name="ListViewDataTemplate">
|
<DataTemplate x:Name="ListViewDataTemplate">
|
||||||
<StackPanel Margin="5,0,0,0" Grid.Column="0">
|
<StackPanel Margin="5,0,0,0" Grid.Column="0">
|
||||||
<TextBlock Text="{Binding Name}" FontSize="20" TextWrapping="NoWrap"/>
|
<TextBlock Text="{Binding Name}" FontSize="20" TextWrapping="NoWrap"/>
|
||||||
<TextBlock Text="{Binding Landmarks}" FontSize="14" TextWrapping="WrapWholeWords" />
|
<TextBlock Text="{Binding LandmarksDescription}" FontSize="14" TextWrapping="WrapWholeWords" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ListView.ItemTemplate>
|
</ListView.ItemTemplate>
|
||||||
|
|||||||
Reference in New Issue
Block a user