Spisu treści:
- Kieszonkowe dzieci
- Krok 1: Definiowanie procesu I: Pobieranie pliku OSM
- Krok 2: Zdefiniowanie procesu II: Zrozumienie danych
- Krok 3: Zdefiniowanie procesu III: Przetwarzanie danych
- Krok 4: Implementacja stylizatora map w Pythonie
- Krok 5: Wada wdrożenia + rozwiązanie
- Krok 6: Obszary do poprawy
- Krok 7: Końcowe myśli
Wideo: Jak tworzyć niestandardowe stylizowane mapy za pomocą OpenStreetMap: 7 kroków (ze zdjęciami)
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:28
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
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
„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:
- Węzły
- Sposoby
- 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
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
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
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
Po zastanowieniu się nad wdrożeniem mojego oprogramowania zidentyfikowałem kilka obszarów, które byłyby pomocne dla zaawansowanych użytkowników.
- 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.
- 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.
- 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
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!
Drugie miejsce w wyzwaniu map
Zalecana:
Utwórz skoroszyt mapy za pomocą Google Maps: 17 kroków (ze zdjęciami)
Utwórz książkę z mapą za pomocą Google Maps: Pewnego dnia szukałem w księgarni przewodnika po ulicach hrabstwa DuPage w stanie Illinois, ponieważ mieszka tam moja dziewczyna i potrzebuje szczegółowej mapy ulic. Niestety, jedynym, który mieli, który był blisko, był ten dla hrabstwa Cook (tak jak ten
Jak tworzyć ślady cząstek w Minecrafcie: 8 kroków
Jak tworzyć ślady cząstek w Minecraft: Witam, dzisiaj pokażę ci, jak tworzyć ślady cząstek w Minecraft
Stwórz niestandardowe stanowisko testowe Arduino za pomocą Wirewrapping: 7 kroków (ze zdjęciami)
Stwórz niestandardowe stanowisko testowe Arduino za pomocą Wirewrapping: Ten instruktaż pokaże Ci łatwy sposób podłączenia Arduino Nano do różnych płytek PCB. Ten projekt powstał podczas moich poszukiwań skutecznego, ale nieniszczącego sposobu na połączenie kilku modułów. Miałem pięć modułów, które chciałem
Jak tworzyć artefakty z przyszłości w molo 9: 11 kroków (ze zdjęciami)
Jak tworzyć artefakty z przyszłości w molo 9: Przede wszystkim, czym są artefakty z przyszłości? Wyobraź sobie, że możesz zabrać ekspedycję archeologa w przyszłość, aby zebrać przedmioty i fragmenty tekstu lub zdjęć, aby zrozumieć, co przyniesie codzienne życie być jak za 10, 20 lub 50 lat. Arty
Jak tworzyć niestandardowe czcionki: 6 kroków
Jak tworzyć niestandardowe czcionki: hej, przyjaciele keystone. Robię to dla wszystkich, ale w szczególności dla Ciebie. Jest tu kilka instrukcji tworzenia czcionek, ale żadna z nich nie jest bardzo wysokiej jakości. to znaczy, działają dobrze, ale gotowy produkt jest niestabilny. będę używał