poniedziałek, 17 lutego 2014

Używanie map OpenStreetMaps


Kod źródłowy do tej lekcji znajduje się tutaj. Rozpakuj go i zaimportuj. W katalogu z kodem źródłowym znajdą się podkatalogi oznaczone numerami. Są to po prostu kolejne wersje kodu, tworzonego w ramach przykładów. Możesz analizować kolejne kroki tworzenia aplikacji, lub od razu zabrać się za kod z katalogu o najwyższym numerku.


Jedną z alternatyw dla stosowania w swoich aplikacjach map od Google jest wykorzystaniem map zod OpenStreetMaps. Są bezpłatne i działają całkiem sprawnie.
Zaczynamy od dodania do projektu niezbędnych blibliotek tj. osmdroid-android-4.0.jar i slf4j-android-1.5.8.jar (lub ich nowszych wersji jeśli takie się pojawią):



Musimy też dodać te biblioteki do Build Path projektu. Robimy to wchodząc do właściwości projektu, następnie przechodząc do „Java Build Path” i wybierając „Add Jars”:



Wybieramy te dwie nowo dodane biblioteki i zatwierdzamy. Czas wstawić obiekt mapy do naszego layoutu. Dodajemy widoczny na poniższej ilustracji element org.osmdroid.views.MapView:


Ponieważ aplikacja będzie musiała pobierać dane (mapy) z internetu, musimy zadbać o odpowiednie pozwolenia. Do pliku manifestu dodajemy więc poniższe linie:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

tuż za tagiem </application>
To są wystarczające uprawnienia niezbędne do działania map OpenStreetMaps. My w naszym przykładzie wykorzystamy naszą realną pozycję z GPS i wyświetlimy fragment mapy z okolicą naszej pozycji. Z tego powodu trzeba będzie dodać jeszcze dodatkowe uprawnienia:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

W przypadku gdybyśmy nie korzystali z pozycji GPS, tych ostatnich uprawnień nie dodajemy. Ogólnie w suemie całość powinna wyglądać mniej więcej tak:


Przechodzimy teraz do aktywności którą wykorzystamy do zaprezentowania mapy. Dodaję kilka pól do klasy. Pola w liniach 17-20 są związane z wykorzystaniem GPS, więc jeśli nie zamierzamy z niego korzystać, nie definiujemy ich. Potrzebne nam będą tylko obiekty z linii 23,24:




Kod z linii 42-45 jest związany z pobraniem pozycji GPS, omawiałem w jednym z poprzednich rozdziałów dokładnie sposób działania takiego kodu i nie będę się tutaj tym zajmował. Nas interesują zasadniczo linie 35-40 i 46-50. Linia 35 to element nie związany z samą mapą jako taką, służy do podpięcia referencji do komponentu mapy. W linii 36 wskazujemy źródło z którego pobieramy mapy. Linie 37 i 38 określają zachowanie mapy. Metoda setBuildInZoomControls (linia 37) ustawia, czy ma być możliwość przybliżania i oddalania na mapie (jeśli podamy true, będą dostępne przyciski + i – na mapie). Metoda setMultiTouchControls (linia 38) ustawia możliwość stosowania gestów dotykowych na ekranie – jak np. zbliżanie i oddalanie widoku dwoma palcami. W linii 40 określamy domyślne przybliżenie mapy. W linii 46 tworzymy obiekt klasy GeoPoint reprezentujący nasze położenie. W linii 49 centrujemy mapę na punkcie wskazanym przez obiekt klasy GeoPoint ustawiony w linii 46. Wywołanie metody invalidate w linii 50 to odświeżenie widoku.



9 komentarzy:

  1. Mozna tez stworzyc UrlTileProvider i korzystac MapView tego androidowego. Ma to taka zalete se ta kontrolka jest po prostu lepsza,umozliwia obracanie i ma ten fajny tilt. W dodatku wydaje mi sie ze dziala szybciej,a kodu nie jest wcale wiecej-jedna dodatkowa klasa na niecale 100 linijek:)

    OdpowiedzUsuń
  2. nie działa wyświetla mi pustą siatkę mimo włączonego internetu i gps w komórce.

    OdpowiedzUsuń
    Odpowiedzi
    1. A wyszedłeś z domu ? :-)

      Usuń
  3. Jeśli widzisz tylko pustą siatkę mapy to musisz dodać w pliku manifest wpis:

    OdpowiedzUsuń
    Odpowiedzi
    1. uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

      Usuń
  4. Nie działa mi wycentrowanie mapy na aktualną pozycję, jak można to naprawic?

    OdpowiedzUsuń
  5. Blog fajny szkoda tylko że autor nie dostosował go do środowiska Android Studio lub nie podał w jaki sposób przygotować eclipse do tworzenia aplikacji android. Obecnie linki do Adroid sdk prowadzą niestety do instalacji wspomnianego środowiska Android Studio co powoduje że laik nie można wykorzystać podanych tu porad bo jakim cudem ma wiedzieć jak przenieść je do android Studio.

    OdpowiedzUsuń
  6. Mi również wyswietla pustą siatke dodałem wpis w Manifest ale nadal to samo...

    OdpowiedzUsuń
  7. Skąd można pobrać najnowsze wersje bibliotek i jak dołączyć je w Android Studio?
    Znalazłem tutorial na stronie https://github.com/osmdroid/osmdroid/wiki/How-to-use-the-osmdroid-library opisujący również bardziej zaawansowane możliwości OpenStreetMaps, ale opisana przez nich metoda polegająca na dodaniu zależności w Gradle nie działa, a strona z bibliotekami i innymi plikami jest bardzo zabałaganiona.

    OdpowiedzUsuń