コード例 #1
0
        private async void Start_Route_Clicked(object sender, EventArgs e)
        {
            bool RouteGestart     = true;
            int  HuidigCoördinaat = 0; //nodig voor het indexen van de volgende locatie, afstand meten tussen gebruiker en volgende punt
            var  route            = (Route)BindingContext;

            try
            {
                var request  = new GeolocationRequest(GeolocationAccuracy.Best);
                var location = await Geolocation.GetLocationAsync(request);                                                      //longitude, latitude en altitude van de gebruiker wordt hier opgevraagd

                Location Gebruiker = new Location(location);                                                                     //locatie gebruiker
                Location BeginPunt = new Location(GekozenRoute[0].Locatie1, GekozenRoute[0].Locatie2);                           //locatie startpunt route
                double   AfstandGebruikerBeginpunt = Location.CalculateDistance(Gebruiker, BeginPunt, DistanceUnits.Kilometers); //afstand berekenen tussen gebruiker en startpunt
                if (AfstandGebruikerBeginpunt > 0.010)                                                                           //als de afstand groter is dan 10 meter
                {
                    RouteGestart = false;                                                                                        //als dit false is wordt de route niet gestart
                    Tekst.Text   = String.Format("U bent niet op het startpunt van de {0} route.", route.NaamRoute);
                    await TextToSpeech.SpeakAsync(Tekst.Text);

                    await Task.Delay(5000);

                    Tekst.Text = null;
                }
            }
            catch (FeatureNotSupportedException NotSupported)
            {
                // Verwerkt not supported on device exception
            }
            catch (FeatureNotEnabledException NotEnabled)
            {
                // Verwerkt not enabled on device exception
            }
            catch (PermissionException NotAllowed)
            {
                // Verwerkt permission exception
            }
            catch (Exception NoLocation)
            {
                // Locatie is niet verkregen
            }

            while (RouteGestart == true)            //binnen 10 meter van de start locatie op start route klikken
            {
                Start_Route.IsEnabled = false;      //button wordt disabled
                Start_Route.Text      = "Onderweg"; //button tekst veranderd
                if (HuidigCoördinaat == 0)
                {
                    Tekst.Text = String.Format("U bent begonnen aan het lopen van de {0} route.", route.NaamRoute); //aanduiding voor de gebruiker dat deze de route gestart is
                    await TextToSpeech.SpeakAsync(Tekst.Text);
                }
                List <Oefening> Oefeningen = await App.Database.LijstOefeningen();

                Map_Start_Route.HasScrollEnabled = false; //kunt de kaart niet zelf aanpassen als de route is gestart
                try
                {
                    var request  = new GeolocationRequest(GeolocationAccuracy.Best);
                    var location = await Geolocation.GetLocationAsync(request); //longitude, latitude en altitude van de gebruiker wordt hier opgevraagd

                    if (location != null)
                    {
                        Map_Start_Route.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(location.Latitude, location.Longitude), Distance.FromMeters(50))); //om de 4 seconden map centreren naar locatie van gebruiker
                        await Task.Delay(4000);
                    }

                    Location Gebruiker  = new Location(location);                                                                             //locatie gebruiker
                    Location Coördinaat = new Location(GekozenRoute[HuidigCoördinaat].Locatie1, GekozenRoute[HuidigCoördinaat].Locatie2);     //locatie volgende punt in route
                    double   Afstand    = Location.CalculateDistance(Gebruiker, Coördinaat, DistanceUnits.Kilometers);                        //afstand berekenen tussen gebruiker en volgende punt

                    if (Afstand < 0.015)                                                                                                      //als de afstand kleiner is dan 15 meter (mogelijk dit te verbeteren met geofencing in de toekomst)
                    {
                        if (GekozenRoute[HuidigCoördinaat].RouteBeschrijving != null || GekozenRoute[HuidigCoördinaat].IDOEfening != null)    //als een punt een routebeschrijving heeft of een oefening heeft
                        {
                            if (GekozenRoute[HuidigCoördinaat].RouteBeschrijving != null & GekozenRoute[HuidigCoördinaat].IDOEfening == null) //als een punt een routebeschrijving heeft
                            {
                                Tekst.Text = GekozenRoute[HuidigCoördinaat].RouteBeschrijving;                                                //richtingsaanwijzing
                                await TextToSpeech.SpeakAsync(Tekst.Text);
                            }
                            if (GekozenRoute[HuidigCoördinaat].RouteBeschrijving != null & GekozenRoute[HuidigCoördinaat].IDOEfening != null) //als een punt een routebeschrijving heeft en een oefening heeft
                            {
                                if (App.Database.OefeningAanUit == true)
                                {
                                    Oefening OefeningBeschrijving = Oefeningen.Find(oefening => oefening.IDOefening == GekozenRoute[HuidigCoördinaat].IDOEfening); //ophalen van de oefening
                                    Tekst.Text = OefeningBeschrijving.OmschrijvingOefening;
                                    await TextToSpeech.SpeakAsync(Tekst.Text);                                                                                     //oefening

                                    await Task.Delay(5000);
                                }
                                Tekst.Text = GekozenRoute[HuidigCoördinaat].RouteBeschrijving; //richtingsaanwijzing
                                await TextToSpeech.SpeakAsync(Tekst.Text);
                            }
                            if (GekozenRoute[HuidigCoördinaat].RouteBeschrijving == null & GekozenRoute[HuidigCoördinaat].IDOEfening != null & App.Database.OefeningAanUit == true) //als een punt een oefening heeft
                            {
                                Oefening OefeningBeschrijving = Oefeningen.Find(oefening => oefening.IDOefening == GekozenRoute[HuidigCoördinaat].IDOEfening);                      //ophalen van de oefening
                                Tekst.Text = OefeningBeschrijving.OmschrijvingOefening;
                                await TextToSpeech.SpeakAsync(Tekst.Text);                                                                                                          //oefening
                            }
                        }
                        if (HuidigCoördinaat < GekozenRoute.Count) //voorkomt index error
                        {
                            HuidigCoördinaat++;                    //voor het indexen van het volgende punt in de route
                        }
                        // Een idee voor de toekomst is om als EindeIsBegin = true het geval is, de route pas te beïndigen bij het startpunt van de route ipv het eindpunt
                        if (HuidigCoördinaat == GekozenRoute.Count) //route is aan het einde
                        {
                            RouteGestart     = false;
                            Start_Route.Text = "Einde!";
                            Tekst.Text       = String.Format("De {0} route is afgelopen, u gaat nu terug naar het hoofdmenu.", route.NaamRoute); // aanduiding voor gebruiker dat deze klaar is met het lopen van de route
                            await TextToSpeech.SpeakAsync(Tekst.Text);

                            await Task.Delay(4000);

                            await Navigation.PopToRootAsync(); //app navigeert naar startmenu, voorkomt problemen met de text-to-speech (pages verschijnen niet, dus text-to-speech wordt niet gebruikt)
                        }
                    }
                }
                catch (FeatureNotSupportedException NotSupported)
                {
                    // Verwerkt not supported on device exception
                }
                catch (FeatureNotEnabledException NotEnabled)
                {
                    // Verwerkt not enabled on device exception
                }
                catch (PermissionException NotAllowed)
                {
                    // Verwerkt permission exception
                }
                catch (Exception NoLocation)
                {
                    // Locatie is niet verkregen
                }
            }
        }
コード例 #2
0
        protected override async void OnAppearing()
        {
            var route = (Route)BindingContext;                                      // verzamel informatie van geselecteerde route, deze is bij RouteKiezen.xaml.cs doorgeven

            GekozenRoute = await App.Database.LijstCoördinatenRoute(route.IDRoute); //ophalen van coördinaten geselecteerde route

            foreach (Coördinaat coördinaat1 in GekozenRoute)                        //pins neerzetten voor de punten(coördinaten) uit de lijst
            {
                double location1 = coördinaat1.Locatie1;
                double location2 = coördinaat1.Locatie2;
                Pin    pin       = new Pin
                {
                    Label    = coördinaat1.Nummer.ToString(),
                    Type     = PinType.Place,
                    Position = new Position(location1, location2)
                };
                pin.MarkerClicked += (s, args) => // disabled het infowindow als je op de pin klikt
                {
                    args.HideInfoWindow = true;
                };
                if (coördinaat1.IDOEfening != null || coördinaat1.RouteBeschrijving != null) // zorgt ervoor dat onzichtbare punten niet worden weergegeven als pins
                {
                    Map_Start_Route.Pins.Add(pin);
                }
                PinsLijst.Add(pin);

                if (PinsLijst.Count >= 2) //als er minstens 2 punten zijn
                {
                    Polyline polyline = new Polyline
                    {
                        StrokeColor = Color.Blue,
                        StrokeWidth = 10,
                        Geopath     =
                        {
                            new Position(GekozenRoute[PinsLijst.Count - 1].Locatie1, GekozenRoute[PinsLijst.Count - 1].Locatie2), // pakt longitude en latitude van voorlaatste item in de list
                            new Position(GekozenRoute[PinsLijst.Count - 2].Locatie1, GekozenRoute[PinsLijst.Count - 2].Locatie2)  // pakt longitude en latitude van laatste item in de list
                        }
                    };

                    Map_Start_Route.MapElements.Add(polyline); //polyline wordt getekent tussen 2 punten
                }
            }
            if (route.EindeIsBegin == true) // tekent polyline tussen eerste en laatste pin als de bool true is
            {
                Polyline polyline1 = new Polyline
                {
                    StrokeColor = Color.Red, // om aan te geven dat deze eigenlijk niet bij de route hoort
                    StrokeWidth = 10,
                    Geopath     =
                    {
                        new Position(GekozenRoute[0].Locatie1, GekozenRoute[0].Locatie2),        // pakt longitude en latitude van eerste item in de list
                        new Position(GekozenRoute.Last().Locatie1, GekozenRoute.Last().Locatie2) // pakt longitude en latitude van laatste item in de list
                    }
                };
                Map_Start_Route.MapElements.Add(polyline1); //polyline van laatste coördinaat naar eerste coördinaat
            }

            double locatie1 = GekozenRoute[0].Locatie1;
            double locatie2 = GekozenRoute[0].Locatie2;

            Map_Start_Route.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(locatie1, locatie2), Distance.FromMeters(50))); //startpunt, locatie eerste coördinaat gekozen route
            Tekst.Text = String.Format("Om de {0} route te starten, moet u zich op het start punt bevinden en op de start knop duwen.", route.NaamRoute);
            await TextToSpeech.SpeakAsync(Tekst.Text);
        }