Spisu treści:

Jak tworzyć niestandardowe stylizowane mapy za pomocą OpenStreetMap: 7 kroków (ze zdjęciami)
Jak tworzyć niestandardowe stylizowane mapy za pomocą OpenStreetMap: 7 kroków (ze zdjęciami)

Wideo: Jak tworzyć niestandardowe stylizowane mapy za pomocą OpenStreetMap: 7 kroków (ze zdjęciami)

Wideo: Jak tworzyć niestandardowe stylizowane mapy za pomocą OpenStreetMap: 7 kroków (ze zdjęciami)
Wideo: PyLight #17 - Marcin Kawka - Jeden wykres wart jest tysiąca słów 2024, Listopad
Anonim
Jak tworzyć niestandardowe stylizowane mapy za pomocą OpenStreetMap
Jak tworzyć niestandardowe stylizowane mapy za pomocą OpenStreetMap

W tej instrukcji opiszę proces, dzięki któremu możesz wygenerować własne stylizowane mapy na zamówienie. Mapa stylizowana to mapa, na której użytkownik może określić, które warstwy danych mają być wizualizowane, a także zdefiniować styl wizualizacji każdej warstwy. Najpierw opiszę proces, dzięki któremu można napisać oprogramowanie do stylizacji map, a następnie zaprezentuję przykład oprogramowania Pythona, które napisałem do wykonania tego zadania.

Poniższy film pokazuje, jak osobiście generuję stylizowane mapy, ale czytaj dalej, aby poznać intymne szczegóły. Jestem bardzo podekscytowany tym, co tworzy społeczność!

Jaka jest moja motywacja stojąca za tym projektem?

Szczerze mówiąc, zacząłem ten projekt, ponieważ pomyślałem, że będzie fajnie. Ten pomysł krążył w mojej głowie przez ostatni rok i w końcu poświęciłem trochę czasu, aby go zrealizować. Po dniu tworzenia prototypów z podstawowymi skryptami udało mi się wygenerować niezwykle obiecujące wyniki - tak obiecujące, że wiedziałem, że muszę sformalizować moje skrypty, aby inni mogli z łatwością tworzyć własne kreacje.

Moja motywacja do napisania tej instrukcji wynika z faktu, że znalazłem bardzo minimalne informacje o tym, jak tworzyć własne stylizowane mapy od podstaw. Mam nadzieję podzielić się ze społecznością tym, czego się nauczyłem.

Zasoby/Linki:

  • OpenStreetMap
  • Informacje prawne OpenStreetMap
  • Repozytorium Github

Kieszonkowe dzieci

  • Dystrybucja Pythona (użyłem Anacondy i Pythona 3.6)
  • PyQt5 (dla zależności GUI)

Krok 1: Definiowanie procesu I: Pobieranie pliku OSM

Definiowanie procesu I: Pobieranie pliku OSM
Definiowanie procesu I: Pobieranie pliku OSM

Kiedy po raz pierwszy zacząłem ten projekt, najbardziej rażącym pytaniem było „gdzie mogę uzyskać dane mapy”. Oczywiście, jak można się spodziewać, od razu pomyślałem o Mapach Google. Po przeprowadzeniu poważnych badań odkryłem, że Google naprawdę nie chce, aby ludzie bawili się swoimi danymi, w sensie kreatywnym lub innym. W rzeczywistości wyraźnie nie zezwalają na przeglądanie stron internetowych z Map Google.

Na szczęście moja rozpacz nie trwała długo po odkryciu OpenStreetMap (OSM). OSM to wspólny projekt, w którym ludzie z całego świata dostarczają dane. OSM wyraźnie zezwala na otwarte korzystanie z ich danych w imię oprogramowania Open Source. W związku z tym wizyta na stronie OSM jest początkiem przygody ze stylizacją mapy.

Po przejściu na stronę OSM kliknij zakładkę „Eksportuj”, aby wyświetlić narzędzia do eksportu map. Teraz powiększ, aby zobaczyć region, w którym chcesz zbierać dane mapy. Wybierz link „Ręcznie wybierz inny obszar”, co spowoduje wyświetlenie okna na ekranie. Ukształtuj i umieść to pole nad interesującym obszarem. Po spełnieniu wymagań kliknij przycisk „Eksportuj”, aby pobrać plik danych OSM.

Uwaga #1: Jeśli wybrany region zawiera zbyt dużo danych, pojawi się błąd, że wybrałeś zbyt wiele węzłów. Jeśli tak się stanie, kliknij przycisk „Overpass API”, aby pobrać większy plik.

Uwaga #2: Jeśli pobrany plik OSM jest większy niż 30 MB, program w Pythonie, który napisałem, będzie zauważalnie wolniejszy. Jeśli chcesz korzystać z dużego regionu, rozważ napisanie skryptu, który wyrzuci zbędne dane, których nie planujesz rysować.

Krok 2: Zdefiniowanie procesu II: Zrozumienie danych

Definiowanie procesu II: zrozumienie danych
Definiowanie procesu II: zrozumienie danych
Definiowanie procesu II: zrozumienie danych
Definiowanie procesu II: zrozumienie danych
Definiowanie procesu II: zrozumienie danych
Definiowanie procesu II: zrozumienie danych
Definiowanie procesu II: zrozumienie danych
Definiowanie procesu II: zrozumienie danych

„Mam dane… co teraz?”

Zacznij od otwarcia pobranego pliku OSM w ulubionym oprogramowaniu do edycji tekstu. Najpierw zauważysz, że jest to plik XML, co jest świetne! XML jest dość łatwy do przeanalizowania. Początek pliku powinien wyglądać prawie identycznie jak pierwszy obraz tego kroku - zostaną wyświetlone niektóre podstawowe metadane i granice geograficzne.

Podczas przewijania pliku zauważysz trzy elementy danych używane w całym tekście:

  1. Węzły
  2. Sposoby
  3. Relacje

Najbardziej podstawowy element danych, węzeł ma po prostu skojarzony z nim unikalny identyfikator, szerokość i długość geograficzną. Oczywiście są dodatkowe metadane, ale możemy je spokojnie odrzucić.

Sposoby to kolekcje węzłów. Sposób może być renderowany jako zamknięty kształt lub jako otwarta linia. Sposoby składają się z kolekcji węzłów identyfikowanych przez ich unikalny identyfikator. Są one oznaczone kluczami definiującymi grupę danych, do której należą. Na przykład sposób przedstawiony na trzecim obrazku powyżej należy do grupy danych „miejsce” i jej podgrupy „wyspa”. Innymi słowy, ta konkretna droga należy do warstwy „wyspa” pod grupą „miejsce”. Sposoby mają również unikalne identyfikatory.

Wreszcie relacje są zbiorami sposobów. Relacja może reprezentować złożony kształt z otworami lub wieloma regionami. Relacje również będą miały unikalny identyfikator i będą oznaczone podobnie jak drogi.

Możesz przeczytać więcej o tych elementach danych z wiki OSM:

  • Węzły
  • Sposoby
  • Relacje

Krok 3: Zdefiniowanie procesu III: Przetwarzanie danych

Definiowanie procesu III: Przetwarzanie danych
Definiowanie procesu III: Przetwarzanie danych

Teraz powinieneś mieć przynajmniej powierzchowne zrozumienie elementów danych, które składają się na plik OSM. W tym momencie jesteśmy zainteresowani odczytaniem danych OSM w wybranym przez Ciebie języku. Chociaż ten krok jest skoncentrowany na Pythonie, jeśli nie chcesz używać Pythona, powinieneś przeczytać tę część, ponieważ zawiera ona kilka wskazówek i sztuczek.

Pakiet xml jest domyślnie dołączany do większości standardowych dystrybucji Pythona. Użyjemy tego pakietu, aby bardzo łatwo przeanalizować nasz plik OSM, jak pokazano na pierwszym obrazku. W pojedynczej pętli for można przetwarzać obsługę danych OSM dla każdego konkretnego elementu danych.

Zauważysz, że w ostatnim wierszu obrazu sprawdzam znacznik „bounds”. Ten krok jest niezwykle ważny w tłumaczeniu wartości szerokości i długości geograficznej na piksele na ekranie. Gorąco polecam uruchomienie tej konwersji w momencie ładowania pliku OSM, ponieważ masowa konwersja danych wymaga intensywnego procesu.

Mówiąc o konwersji szerokości i długości geograficznej na współrzędne ekranowe, oto link do funkcji obliczeniowej, którą napisałem. Prawdopodobnie zauważysz coś dziwnego podczas konwersji szerokości geograficznej na współrzędne ekranowe. W porównaniu do długości geograficznej istnieje dodatkowy krok! Jak się okazuje, dane OSM są modelowane przy użyciu metody projekcji Pseudo-Mercator. Na szczęście OSM ma tutaj fantastyczną dokumentację na ten temat i zapewnia funkcje konwersji szerokości geograficznej dla znacznej liczby języków. Niesamowite!

Uwaga: W moim kodzie współrzędna ekranu (0, 0) to lewy górny róg ekranu.

Krok 4: Implementacja stylizatora map w Pythonie

Implementacja stylizatora map w Pythonie
Implementacja stylizatora map w Pythonie
Implementacja stylizatora map w Pythonie
Implementacja stylizatora map w Pythonie
Implementacja stylizatora map w Pythonie
Implementacja stylizatora map w Pythonie

Do tego momentu omówiłem plik danych OSM - co to jest, jak go czytać i co z nim zrobić. Teraz omówię oprogramowanie, które napisałem do obsługi stylistycznej wizualizacji map (repozytorium GitHub podane we wstępie).

Moja konkretna implementacja skupia się na kontroli użytkownika potoku renderowania. W szczególności pozwalam użytkownikowi wybrać warstwy, które mają być widoczne, i sposób, w jaki ta warstwa ma być wizualizowana. Jak już pokrótce wspomniałem wcześniej, renderowane są dwie klasy elementów: elementy wypełnienia i elementy zamówienia. Wypełnienia są definiowane tylko przez kolor, podczas gdy linie są definiowane przez kolor, szerokość linii, styl linii, styl zakończenia linii i styl łączenia linii.

Gdy użytkownik dokonuje modyfikacji stylów warstw i widoczności, zmiany są odzwierciedlane w widżecie mapy po prawej stronie. Gdy użytkownik odpowiednio zmodyfikuje wygląd mapy, może dostosować maksymalny wymiar mapy i zapisać mapę jako obraz na swoim komputerze. Podczas zapisywania obrazu zostanie również zapisany plik konfiguracyjny użytkownika. Dzięki temu użytkownik może w dowolnym momencie przywołać i ponownie wykorzystać konfigurację, której użył do wygenerowania określonego obrazu.

Krok 5: Wada wdrożenia + rozwiązanie

Wada wdrożenia + rozwiązanie
Wada wdrożenia + rozwiązanie
Wada wdrożenia + rozwiązanie
Wada wdrożenia + rozwiązanie

Kiedy po raz pierwszy zacząłem ręcznie stylizować mapę, dowiedziałem się, że jest to dość żmudny proces. Oferowanie użytkownikowi maksymalnej kontroli może być po prostu przytłaczające ze względu na dużą liczbę dostępnych „pokręteł”. Istnieje jednak proste rozwiązanie, które wymaga trochę dodatkowego skryptowania.

Zacząłem od określenia, które warstwy mnie szczególnie interesują. Na potrzeby tego instruktażu, powiedzmy, że najbardziej interesują mnie budynki (wszystkie), rzeki, główne autostrady i ulice naziemne. Napisałbym skrypt, w którym tworzę instancję Configuration, odpowiednio przełączam stany warstw za pomocą funkcji setItemState() i zdefiniowanych stałych oraz ustawiam kolory w oparciu o to, jak chciałbym, aby moje warstwy wyglądały za pomocą setValue(). Wynikowy plik konfiguracyjny, który zostanie zapisany, może zostać skopiowany do folderu configs i załadowany przez użytkownika.

Przykładowy skrypt znajduje się na powyższym obrazku. Drugi obraz jest próbką tego, jak wyglądałyby funkcje pomocnicze, a ponieważ zasadniczo wszystkie są identyczne, tylko ze zmieniającymi się stałymi, zamieściłem tylko jeden przykład.

Krok 6: Obszary do poprawy

Obszary do poprawy
Obszary do poprawy

Po zastanowieniu się nad wdrożeniem mojego oprogramowania zidentyfikowałem kilka obszarów, które byłyby pomocne dla zaawansowanych użytkowników.

  1. Dynamiczne renderowanie warstw. Obecnie mam predefiniowaną listę warstw, które będą renderowane, to wszystko. Częścią uzasadnienia była trudność w określeniu, czy warstwa powinna być linią, czy wypełnieniem. W rezultacie prawie każdy otwarty plik OSM zostanie powitany mnóstwem ostrzeżeń o warstwach, które nie zostaną wyrenderowane. Często są one tak minimalne, że nie stanowi to problemu, ale na pewno brakuje krytycznych warstw. Dynamiczne renderowanie warstw wyeliminowałoby te problemy.
  2. Przypisanie warstwy dynamicznej. To idzie w parze z #1; jeśli chcesz dynamiczne renderowanie warstw, potrzebujesz dynamicznego przypisania warstwy (tj. Identyfikacji warstwy wypełnienia w porównaniu z warstwą liniową). Można to rozsądnie osiągnąć, jak się dowiedziałem, ponieważ Drogi, których pierwszy i ostatni węzeł są takie same, będą ścieżkami zamkniętymi, a zatem wypełnionymi.
  3. Grupy kolorów. Stylizowana mapa często zawiera kilka warstw, które mają ten sam styl, a umożliwienie użytkownikowi jednoczesnej modyfikacji stylu grupy znacznie skróciłoby czas spędzony przez użytkownika na edytowaniu warstw jedna po drugiej.

Krok 7: Końcowe myśli

Myśli zamykające
Myśli zamykające
Myśli zamykające
Myśli zamykające
Myśli zamykające
Myśli zamykające

Dziękuję wszystkim za poświęcenie czasu na przeczytanie mojego Instructable. Ten projekt stanowi kulminację wielu godzin badań, projektowania, programowania i debugowania. Mam nadzieję, że udało mi się dostarczyć platformę startową, z której można zbudować własny projekt lub zbudować na tym, co już napisałem. Mam również nadzieję, że moje niedociągnięcia i wskazówki dostarczą wielu punktów do rozważenia w swoim projekcie. Jeśli jesteś mniej skłonny do programowania, a bardziej skłonny do tworzenia dzieł sztuki, chętnie zobaczę, co zrobisz w komentarzach! Możliwości są nieskończone!

Specjalne podziękowania dla współtwórców OpenStreetMap! Takie projekty nie byłyby możliwe bez ich znacznego wysiłku.

Daj mi znać, jeśli masz jakieś pytania w komentarzach!

Wyzwanie map
Wyzwanie map
Wyzwanie map
Wyzwanie map

Drugie miejsce w wyzwaniu map

Zalecana: