Obsah:
- Zásoby
- Krok 1: Definování procesu I: Stažení souboru OSM
- Krok 2: Definování procesu II: Pochopení dat
- Krok 3: Definování procesu III: Trávení dat
- Krok 4: Implementace stylizátoru Python Map
- Krok 5: Implementace Nevýhoda + řešení
- Krok 6: Oblasti pro zlepšení
- Krok 7: Uzavření myšlenek
Video: Jak vytvořit vlastní stylizované mapy pomocí OpenStreetMap: 7 kroků (s obrázky)
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:20
V tomto pokynu popíšu proces, pomocí kterého můžete generovat vlastní stylizované mapy na míru. Stylizovaná mapa je mapa, kde uživatel může určit, které datové vrstvy jsou vizualizovány, a také definovat styl, ve kterém je každá vrstva vizualizována. Nejprve popíšu proces, pomocí kterého můžete psát software pro stylizaci map, a poté příklad softwaru Python, který jsem napsal k provedení tohoto úkolu.
Následující video zdůrazňuje, jak osobně generuji stylizované mapy, ale pokračujte ve čtení intimních podrobností. Jsem velmi nadšený, že vidím, co komunita vytváří!
Jaká je moje motivace za tímto projektem?
Upřímně řečeno, zahájil jsem tento projekt, protože jsem si myslel, že by bylo zábavné to dělat. Tato myšlenka se mi v mysli honila poslední rok a já jsem si nakonec našel čas, který jsem potřeboval k jejímu uskutečnění. Po dni prototypování s některými základními skripty jsem byl schopen generovat extrémně slibné výsledky - tak slibné, že jsem věděl, že musím své skripty formalizovat tak, aby ostatní mohli snadno vytvářet vlastní výtvory.
Moje motivace při psaní tohoto pokynu je způsobena skutečností, že jsem našel velmi minimální informace o tom, jak vytvořit vlastní stylizované mapy od začátku. Doufám, že se o to, co jsem se naučil, podělím s komunitou.
Zdroje/Odkazy:
- OpenStreetMap
- OpenStreetMap Legalese
- Úložiště Github
Zásoby
- Distribuce Pythonu (použil jsem Anaconda a Python 3.6)
- PyQt5 (pro závislosti GUI)
Krok 1: Definování procesu I: Stažení souboru OSM
Když jsem poprvé zahájil tento projekt, nejzářivější otázkou bylo „kde mohu získat mapová data“. Přirozeně, jak byste čekali, mě okamžitě napadlo Google Maps. Po významném výzkumu jsem zjistil, že Google opravdu nechce, aby si lidé hráli s jejich daty, ať už v kreativním smyslu nebo jinak. Ve skutečnosti výslovně zakazují škrábání webu z Map Google.
Naštěstí mé zoufalství trvalo krátce po mém objevu OpenStreetMap (OSM). OSM je společný projekt zahrnující lidi z celého světa, kteří přispívají údaji. OSM výslovně povoluje otevřené používání jejich dat pod názvem Open Source software. Návštěva webové stránky OSM proto začíná stylizací mapy.
Po příjezdu na webovou stránku OSM zobrazíte kliknutím na kartu „Export“nástroje pro export mapy. Nyní přiblížením zobrazíte region, ve kterém vás zajímá shromažďování mapových dat. Vyberte odkaz „Ručně vybrat jinou oblast“, čímž se na obrazovce zobrazí pole. Vytvarujte a umístěte toto pole nad oblast zájmu. Až budete spokojeni, stáhněte si datový soubor OSM kliknutím na tlačítko „Exportovat“.
Poznámka č. 1: Pokud vybraná oblast obsahuje příliš mnoho dat, zobrazí se chyba, že jste vybrali příliš mnoho uzlů. Pokud se vám to stane, stáhněte si větší soubor kliknutím na tlačítko „Overpass API“.
Poznámka č. 2: Pokud je váš stažený soubor OSM větší než 30 MB, program Python, který jsem napsal, se znatelně zpomalí. Pokud jste odhodláni použít velkou oblast, zvažte napsání skriptu, který vyhodí nadbytečná data, která neplánujete kreslit.
Krok 2: Definování procesu II: Pochopení dat
„Mám data… a co teď?“
Začněte otevřením staženého souboru OSM ve vašem oblíbeném softwaru pro úpravu textu. Nejprve si všimnete, že se jedná o soubor XML, což je skvělé! XML lze snadno analyzovat. Začátek souboru by měl vypadat téměř shodně s prvním obrázkem tohoto kroku - budou uvedena některá základní metadata a geografické hranice.
Při posouvání souboru si všimnete tří datových prvků použitých v celém textu:
- Uzly
- Způsoby
- Vztahy
Nejzákladnější datový prvek, uzel, má jednoduše jedinečný identifikátor, zeměpisnou šířku a délku. Samozřejmě existují další metadata, ale můžeme je bezpečně zahodit.
Způsoby jsou kolekce uzlů. Způsob může být vykreslen jako uzavřený tvar nebo jako otevřená čára. Způsoby se skládají ze souboru uzlů identifikovaných jejich jedinečným identifikátorem. Jsou označeny klíči, které definují datovou skupinu, do které patří. Například způsob zobrazený na třetím obrázku výše patří do datové skupiny „místo“a její podskupiny „ostrov“. Jinými slovy, tento konkrétní způsob patří do „ostrovní“vrstvy ve skupině „místo“. Způsoby mají také jedinečné identifikátory.
A konečně, vztahy jsou sbírky způsobů. Relace může představovat složitý tvar s otvory nebo s více oblastmi. Vztahy budou mít také jedinečný identifikátor a budou označeny podobně jako způsoby.
Více o těchto datových prvcích si můžete přečíst na wiki OSM:
- Uzly
- Způsoby
- Vztahy
Krok 3: Definování procesu III: Trávení dat
Nyní byste měli alespoň povrchně porozumět datovým prvkům, které tvoří soubor OSM. V tuto chvíli máme zájem číst data OSM pomocí vámi zvoleného jazyka. I když je tento krok zaměřen na Python, pokud nechcete používat Python, měli byste si tuto část přečíst, protože obsahuje několik tipů a triků.
Balíček xml je standardně součástí většiny standardních distribucí Pythonu. Tento balíček použijeme k velmi snadné analýze našeho souboru OSM, jak ukazuje první obrázek. V jedné smyčce for můžete zpracovat zpracování dat OSM pro každý konkrétní datový prvek.
Na posledním řádku obrázku si všimnete, že kontroluji značku 'bounds'. Tento krok je životně důležitý při překladu hodnot zeměpisné šířky a délky do pixelů na obrazovce. Tuto konverzi vřele doporučuji spustit při načítání souboru OSM, protože hromadná konverze dat je náročná na proces.
Když už mluvíme o převodu zeměpisných šířek a délek na souřadnice obrazovky, zde je odkaz na výpočetní funkci, kterou jsem napsal. Při převodu souřadnic zeměpisné šířky na obrazovku si pravděpodobně všimnete něčeho trochu zvláštního. Ve srovnání s délkou je zahrnut další krok! Jak se ukázalo, data OSM jsou modelována pomocí projekční metody Pseudo-Mercator. Naštěstí zde má OSM fantastickou dokumentaci k tomuto tématu a poskytuje funkce převodu zeměpisné šířky pro značný počet jazyků. Skvělý!
Poznámka: V mém kódu je souřadnice obrazovky (0, 0) levým horním rohem obrazovky.
Krok 4: Implementace stylizátoru Python Map
Až do tohoto bodu jsem diskutoval o datovém souboru OSM - co to je, jak jej číst a co s ním dělat. Nyní budu diskutovat o softwaru, který jsem napsal pro řešení vizualizace stylových map (repo GitHub uvedené v úvodu).
Moje konkrétní implementace se zaměřuje na uživatelskou kontrolu vykreslovacího kanálu. Konkrétně dovoluji uživateli vybrat vrstvy, které chce vidět, a jak chce, aby byla tato vrstva vizualizována. Jak jsem již stručně zmínil dříve, jsou vykresleny dvě třídy prvků: výplňové položky a řádkové položky. Výplně jsou definovány pouze barvou, zatímco čáry jsou definovány barvou, šířkou čáry, stylem čáry, stylem čáry a stylem spojování čar.
Když uživatel provádí úpravy stylů a viditelnosti vrstev, změny se projeví ve widgetu mapy vpravo. Jakmile uživatel upraví vzhled mapy ke své spokojenosti, může upravit maximální rozměr mapy a uložit mapu jako obrázek do svého počítače. Při ukládání obrázku bude také uložen konfigurační soubor uživatele. To zajišťuje, že si uživatel může kdykoli vyvolat a znovu použít konfiguraci, kterou použil ke generování konkrétního obrazu.
Krok 5: Implementace Nevýhoda + řešení
Když jsem poprvé začal ručně stylizovat mapu, zjistil jsem, že to byl dost zdlouhavý proces. Nabízet uživateli maximální kontrolu může být jednoduše ohromující kvůli velkému počtu dostupných „knoflíků“. Existuje však jednoduché řešení, které vyžaduje trochu dalšího skriptování.
Začal jsem tím, že jsem identifikoval, o které vrstvy mám největší zájem. Pro účely tohoto pokynu řekněme, že mě nejvíce zajímají budovy (všechny), řeky, hlavní dálnice a povrchové ulice. Napsal bych skript, kde vytvořím instanci Configuration, vhodně přepínám stavy vrstev pomocí funkce setItemState () a definovaných konstant a nastavuji barvy podle toho, jak bych chtěl, aby se mé vrstvy zobrazovaly pomocí setValue (). Výsledný uložený konfigurační soubor lze zkopírovat do složky configs a načíst jej uživatel.
Příklad skriptu je na obrázku výše. Druhý obrázek je ukázkou toho, jak by pomocné funkce vypadaly, a protože jsou v podstatě všechny totožné, jen s různými konstantami, vložil jsem pouze obrázek jednoho příkladu.
Krok 6: Oblasti pro zlepšení
Po zamyšlení nad implementací softwaru jsem identifikoval několik oblastí, které by mohly být nápomocné vylepšení pro zkušené uživatele.
- Dynamické vykreslování vrstev. V současné době mám předdefinovaný seznam vrstev, které budou vykresleny, to je vše. Součástí ospravedlnění byla obtížnost určení, zda má být vrstva čárou nebo výplní. V důsledku toho vás téměř u každého souboru OSM, který otevřete, uvítá spousta varování o vrstvách, které nebudou vykresleny. Často jsou tak minimální, že to není problém, ale určitě chybí kritické vrstvy. Dynamické vykreslování vrstev by tyto obavy odstranilo.
- Dynamické přiřazování vrstev. To jde ruku v ruce s č. 1; pokud chcete dynamické vykreslování vrstev, potřebujete dynamické přiřazení vrstvy (tj. identifikaci výplňové vrstvy vs. řádkové vrstvy). Toho lze rozumně dosáhnout, jak jsem se dozvěděl, protože způsoby, jejichž první a poslední uzel jsou stejné, budou uzavřené cesty, a proto vyplněné.
- Barevné skupiny. Stylizovaná mapa má často několik vrstev se stejným stylem a umožnění uživateli současně upravit styl skupiny by výrazně zkrátilo čas strávený úpravou vrstev po jednom.
Krok 7: Uzavření myšlenek
Děkuji všem, že jste si našli čas na přečtení mého Instructable. Tento projekt představuje vyvrcholení mnoha hodin výzkumu, návrhu, programování a ladění. Doufám, že se mi podařilo poskytnout odpalovací rampu, ze které si můžete postavit vlastní projekt nebo navázat na to, co jsem již napsal. Doufám také, že mé nedostatky a tipy poskytnou spoustu bodů, které je třeba vzít v úvahu při návrhu. Pokud jste méně nakloněni programu a více nakloněni tvorbě uměleckých děl, rád bych viděl, co v komentářích vytvoříte! Možnosti jsou nekonečné!
Zvláštní poděkování přispěvatelům OpenStreetMap! Podobné projekty by nebyly možné bez jejich značného úsilí.
Pokud máte nějaké dotazy, dejte mi prosím vědět v komentářích!
Druhý v soutěži Maps Challenge
Doporučuje:
Vytvořte vlastní mapy pro svůj Garmin GPS: 8 kroků (s obrázky)
Vytvářejte vlastní mapy pro svůj Garmin GPS: Pokud máte Garmin GPS určený pro turistiku a další outdoorové aktivity (včetně řady GPSMAP, eTrex, Colorado, Dakota, Oregon a Montana, mimo jiné), nemusíte spokojit se s mapami holých kostí, které na něm byly předem načteny. E
Jak si vytvořit vlastní WIFI bránu pro připojení Arduina k síti IP?: 11 kroků (s obrázky)
Jak si vytvořit vlastní WIFI bránu pro připojení Arduina k síti IP?: Jako mnoho lidí si myslíte, že Arduino je velmi dobrým řešením pro domácí automatizaci a robotizaci! Ale pokud jde o komunikaci, Arduinos přichází pouze se sériovými linkami. Pracuji na robotu, který musí být trvale připojen k serveru, který běží
Jak si vytvořit vlastní herní konzoli: 6 kroků (s obrázky)
Jak si vytvořit vlastní herní konzoli: Už jste někdy chtěli udělat vlastní herní konzoli? Konzole, která je levná, malá, výkonná a dokonce se perfektně vejde do kapsy? V tomto projektu vám tedy ukážu, jak vytvořit herní konzoli pomocí Raspberry Pi. Ale co je Raspberry
Jak vytvořit vlastní reproduktory: 25 kroků (s obrázky)
Jak vybudovat vlastní reproduktory: Budování vlastních reproduktorů musí být jednou z nejvíce obohacujících, nejjednodušších a nákladově nejefektivnějších činností pro kutily, se kterými jsem se setkal. Jsem absolutně šokován, že to nemělo větší přítomnost na Instructables a v komunitě … no
Jak vytvořit autonomního robota hrajícího basketbal pomocí IRobota Vytvořit jako základ: 7 kroků (s obrázky)
Jak vytvořit autonomního robota hrajícího basketbal pomocí IRobota Vytvořit jako základ: Toto je můj příspěvek k výzvě iRobot Create. Nejtěžší na celém tomto procesu pro mě bylo rozhodnout, co bude robot dělat. Chtěl jsem předvést skvělé funkce Create a zároveň přidat trochu robo vkusu. Všechny moje