XI. Mapa 1. Pomocnicze Autoryzacja aplikacji Windows Phone 8.1 Silverlight 1. Konto developera na: https://developer.microsoft.com/pl-pl/windows - zalogować się kontem Microsoft lub utworzyć nowe 2. Po zalogowaniu wybierz Pulpit nawigacyjny (Dashboard). 3. Wybierz Utwórz nową aplikację, i Rozpocznij tworzenie aplikacji od zastrzeżenia nazwy wprowadź nazwę i wybierz Zastrzeż nazwę produktu 4. Przegląd aplikacji wybierz Usługi, Mapy i Pobierz token (Get token) a. Identyfikator aplikacji usługi mapy: xxxb0649-7d61-4d6c-9c7c-ccb9325a9164 b. Token uwierzytelniania usługi mapy: xxx8sk5uvb6eyy6vuakrxg c. aktywne po max 30 min. Błędy nr/komunikat znaczenie wersja HRESULT: 0x8004231C brak autoryzacji (ApplicationId, AuthenticationToken) WP8.1, SL brak tokenów HRESULT: 0x80042706 tokeny nieprawidłowe - za wcześnie po jw. utworzeniu?? 42327; 4022328 nie można wytyczyć trasy (np. z Ameryki Płn. do Europy ) Wersja języka zależna od ustawień telefonu (Settings, Language 49
2. Mapa, zoom, tryb wyświetlania. Menu 1. Rozpocznij tworzenie nowego projektu (Windows Phone, Blank App (Silverlight), OS Version 8.1 2. Tytuł aplikacji ( MY APPLICATION ) zamień na NAWI- GATOR ; page name na mapa 3. Umieść w ContentPanel kontrolkę Map, zmień jej nazwę na mojamapa; bez marginesów, bez rozmiaru 4. W projekcie, w folderze Assets załóż nowy podfolder Ikony wkopiuj pliki A.png, R.png, plus.png, minus.png. 5. Designer xaml: zdefiniuj menu (przed </phone:phoneapplicationpage> <phone:phoneapplicationpage.applicationbar> <shell:applicationbar IsMenuEnabled="True"> <shell:applicationbariconbutton IconUri="/Images/appbar_button1.png" Text="Button 1"/> <shell:applicationbariconbutton IconUri="/Images/appbar_button2.png" Text="Button 2"/> <shell:applicationbar.menuitems> <shell:applicationbarmenuitem Text="MenuItem 1"/> <shell:applicationbarmenuitem Text="MenuItem 2"/> </shell:applicationbar.menuitems> </shell:applicationbar> </phone:phoneapplicationpage.applicationbar> przed znacznikiem końca: </phone:phoneapplicationpage> 6. w części IconButton a. pierwsze dwie pozycje: powiększenie i pomniejszenie (odpowiednio zmień właściwości Text, b. dopisz kolejną pozycję, która posłuży do zmiany trybu mapy (jako przełącznik odpowiednio tryb drogi lub teren ), c. zdefiniuj dla każdej pozycji zdarzenie Click, odpowiednio: pow_click, pom_click, tryb_click; w każdym wywołaniu wciśnij F12 (generuje procedurę zdarzeniową) d. zmień odpowiednio właściwości IconUri tak, żeby wskazywały na ikony folderu Ikony. 7. Zapisz i uruchom aplikację. 8. Procedury zdarzeniowe a. pow_click, pom_click - powiększanie/pomniejszanie (zmiana skali mapy): i. dla kontrolki mapy (jak się nazywa?) odpowiednio zwiększaj/zmniejszaj właściwość ZoomLevel, b. dodaj przestrzeń nazw Microsoft.Phone.Shell oraz Microsoft.Phone.Controls.Maps 50
c. tryb_click: tryb wyświetlania mapy(cartographicmode): z enum MapCartographicMode:drogi (Road)/ teren (Aerial), procedura która na przemian zmienia tryb oraz ikonę A-R i. w procedurze utwórz obiekt o nazwie ab klasy ApplicationBarIconButton ii. przypisz do ab wartość parametru sender (rzutuj na ApplicationBarIconButton) iii. dla mapy - sprawdź, jaki aktualnie jest tryb zamień na przeciwny: jeżeli: mojamapa.cartographicmode == MapCartographicMode.Aerial to zamień: mojamapa.cartographicmode = MapCartographicMode.Road; ab.text = "lotnicza"; ab.iconuri = new Uri(@"/Assets/Ikony/A.png", UriKind.Relative); w przeciwnym przypadku przywróć tryb Aerial, napis drogowa oraz ikonkę R.png 51
3. Geolokalizacja Współrzędne punktu startowego(położenie telefonu) zostaną określone przez wbudowany GPS. Użytkownik poda adres punktu docelowego usługa wyznaczy współrzędne punktu docelowego. Po powrocie do strony głównej oba punkty zostaną oznaczone na mapie poprzez tzw. Pushpin-y. Pomiędzy tymi punktami wytyczona zostanie trasa linią prostą oraz trasa przejazdu samochodem. 1) Na stronie MainPage pierwsza pozycja menu (ApplicationBarMenuItem): a) zmień tekst z menuitem 1 na współrzędne, b) dla zdarzenia Click napisz procedurę przejścia (nawigacji) do strony "/Koordynaty.xaml" (metoda Navigate z klasy NavigationService) 2) Dodaj nową stronę o nazwie Koordynaty (Solution Explorer, nazwa projektu, menu podręczne, Add New Item Windows Phone Portrait Page), w której będzie: a) wyświetlenie współrzędnych bieżących z GPS-a (moje położenie) pole tekstowe tbgps b) wprowadzenie z ręki adresu docelowego (np. Gdańsk, Polska) pole tekstowe txadres, c) przycisk uruchomienia wyznaczenia koordynat celu. 3) Przygotuj klasę, która umożliwi przekazanie danych ze strony Koordynady.xaml do strony MainPage.xaml (będą to współrzędne punktu startowego oraz docelowego) a) dodaj do projektu nową klasę (Add, Class) o nazwie DaneGeograficzne; usuń wszystkie instrukcje using, wstaw tylko: using System.Device.Location; b) w klasie DaneGeograficzne zdefiniuj: i) dwa publiczne statyczne pola typu GeoCoordinate odpowiednio o nazwie pktstartowy oraz pktdocelowy; ustaw na null ii) jedno pole publiczne statyczne tekstowe opiscelu. 4) Zapisz wszystko (Ctrl+Shift+S), wróć do kodu strony Koordynaty.xaml.cs a) dodaj przestrzeń nazw Windows.Devices.Geolocation b) w metodzie asynchronicznej void GdzieJaNaMapie()odczytaj współrzędne aktualne z GPS-a: i) zainicjuj obiekt mójgps klasy Geolocator, ii) odczytaj aktualne położenie dla obiektu mójgps wywołaj asynchroniczną (await) metodę GetGeopositionAsync(); wynik zapisz do obiektu mojezgps klasy Geoposition iii) odczytaj długość i szerokość geograficzną punktu startowego (mojezgps.coordinate.longitude; mojezgps.coordinate.latitude), iv) odczytaną długość i szerokość geograficzną wyświetl w tbgps, v) zapisz do pola pktstartowy klasy DaneGeograficzne (zrób nowy obiekt new System.Device.Location.GeoCoordinate(); zainicjuj w nim pola Latitude i Longitude odpowiednimi wartościami szerokości i długości geograficznej. 53
5) Wskaż w używanych zasobach urządzenia (w application manifest) użycie funkcjonalności lokalizacji zaznacz ID_CAP_LOCATION w WMAppManifest.xml-Capabilities. Zapisz, skompiluj jeżeli brak błędów - uruchom program. 6) Geolokalizacja podanego adresu a) MainPage: uprawnienia (dla zdarzenia Loded dla mapy): Microsoft.Phone.Maps.MapsSettings.ApplicationContext.ApplicationId = "xxxb0649-7d61-4d6c-9c7c-ccb9325a9164"; Microsoft.Phone.Maps.MapsSettings.ApplicationContext.AuthenticationToken = "xxx8sk5uvb6eyy6vuakrxg"; b) Koordynaty.xaml: using Microsoft.Phone.Maps.Services; c) Button szukaj celu, Click private void btszukajcelu_click(object sender, RoutedEventArgs e) GeocodeQuery AdresNaKoordynaty =new GeocodeQuery(); AdresNaKoordynaty.SearchTerm = txadres.text; ; AdresNaKoordynaty.GeoCoordinate = DaneGeograficzne.pktStartowy; AdresNaKoordynaty.QueryCompleted += AdresNaKoordynaty_QueryCompleted; AdresNaKoordynaty.QueryAsync(); d) rezultat zapytania private void AdresNaKoordynaty_QueryCompleted(object sender, QueryCompletedEventArgs<IList<MapLocation>> e) if (e.error == null) DaneGeograficzne.pktDocelowy = e.result[0].geocoordinate; tbdlg.text = string.format("0:f3", DaneGeograficzne.pktDocelowy.Longitude); tbszer.text = string.format("0:f3", DaneGeograficzne.pktDocelowy.Latitude); else MessageBox.Show(e.Error.Message + ": " + e.error.hresult, "BŁĄD!",MessageBoxButton.OK); 7) Uruchom, sprawdź działanie. 54
XII. Mapa cz. II znaczniki i trasa 1) Skompiluj, usuń błędy, uruchom, sprawdź testowanie wprowadzonych danych 2) Wróć do kodu strony głównej (MainPage.xaml.cs) 3) Dodaj: a) przestrzeń nazw System.Windows.Navigation, b) przestrzeń nazw System.Device.Location; 4) Przed wyświetleniem strony głównej - metoda: protected override void OnNavigatedTo(NavigationEventArgs e) a) sprawdź, czy są dane w DaneGeograficzne jeżeli nie, zakończ, b) dla Bydgoszczy - utwórz znacznik pktstartowy (obiekt klasy MapOverlay) i) Content - niebieskie koło (Ellipse) fi20, ii) PositionOrigin = new System.Windows.Point(0.5, 0.5), iii) GeoCoordinate = wsp. geograf. punktu startowego c) analogicznie drugi znacznik pktdocelowy i) Content - adres punktu docelowego ii) reszta jw. d) utwórz nową warstę mapy warstwazpunktami (obiekt klasy MapLayer) i) metodą Add dodaj pktstartowy oraz pktdocelowy e) dla mapy mojamapa i) do warstw (Layers) dodaj metodą Add utworzoną warstwazpunktami ii) metod SetView ustaw centrowanie na pktstartowy, skala na 7. 5) Skompiluj, usuń błędy, uruchom, sprawdź (użyj lokalizacji dla emulatora ustaw położenie aktualne na Bydgoszcz). 6) Dodaj linię łączącą oba punkty pktstardowy oraz pktdocelowy a) obiekt trasalotem klasy MapPolyline i) Stroke = new SolidColorBrush(Colors.Orange), ii) StrokeThickness = 4, iii) Path kolekcja typu GeoCoordinateCollection - punkty wyznaczające początek i koniec: Path = new GeoCoordinateCollection() DaneGeograficzne.pktStartowy, DaneGeograficzne.pktDocelowy 57
b) dodaj do mapy: do elementów mapy (MapElements) metodą Add() 7) Odległość (pktstartowy, pktdocelowy): a) dla pktstartowy użyj GetDistanceTo(DaneGeograficzne.pktDocelowy) b) wyświetl komunikat z odległością w [km] 8) Uruchom, sprawdź działanie aplikacji. 9) using: Microsoft.Phone.Maps.Services; System.Collections.Generic 10) Przejazd drogami metoda void Trasa() a) obiekt ZapytanieTrasa klasy RouteQuery i) Waypoints - punkty wyznaczające trasę kolekcja typu GeoCoordinateCollection ii) wstawić z DaneGeograficzne b) dla ZapytanieTrasa i) obsługa zdarzenia QueryCompleted ii) wysłanie zapytania metoda QueryAsync() 11) Trasa na mapie - procedura obsługi zdarzenia QueryCompleted a) sprawdzić, czy nie ma błędu (e.error), b) odczytać informacje (obiekt mojatrasa) o trasie (e.result), i) utworzyć graficzny obraz trasy: obiekt trasanamapie klasy MapRoute; mojatrasa jako parametr konstruktora, ii) obiekt trasanamapie dodać do mojamapa metodą AddRoute(trasaNaMapie) 12) Uruchom, sprawdź działanie aplikacji. 58