Indholdsfortegnelse:

Sådan oprettes tilpassede, stiliserede kort ved hjælp af OpenStreetMap: 7 trin (med billeder)
Sådan oprettes tilpassede, stiliserede kort ved hjælp af OpenStreetMap: 7 trin (med billeder)

Video: Sådan oprettes tilpassede, stiliserede kort ved hjælp af OpenStreetMap: 7 trin (med billeder)

Video: Sådan oprettes tilpassede, stiliserede kort ved hjælp af OpenStreetMap: 7 trin (med billeder)
Video: Dwains Dashboard with Mushroom Cards - How to set up - In-depth Tutorial 2024, Juli
Anonim
Sådan opretter du tilpassede stiliserede kort ved hjælp af OpenStreetMap
Sådan opretter du tilpassede stiliserede kort ved hjælp af OpenStreetMap

I denne instruktive vil jeg beskrive en proces, hvorigennem du kan generere dine egne specialfremstillede stiliserede kort. Et stiliseret kort er et kort, hvor brugeren kan angive, hvilke datalag der visualiseres, samt definere den stil, som hvert lag visualiseres med. Jeg vil først beskrive den proces, hvorigennem du kan skrive software til stilisering af kort, efterfulgt af et eksempel på Python -softwaren, jeg skrev for at udføre denne opgave.

Den følgende video fremhæver, hvordan jeg personligt genererer stiliserede kort, men fortsætter med at læse for de intime detaljer. Jeg er meget spændt på at se, hvad fællesskabet skaber!

Hvad er min motivation bag dette projekt?

Helt ærligt startede jeg dette projekt, fordi jeg syntes, det ville være sjovt at lave. Denne idé har raslet rundt i mit sind det sidste år, og jeg tog endelig den tid, jeg havde brug for, for at få den til at fungere. Efter en dag med prototyper med nogle grundlæggende scripting var jeg i stand til at generere ekstremt lovende resultater - så lovende, at jeg vidste, at jeg var nødt til at formalisere mine scripts, så andre let kunne lave deres egne kreationer.

Min motivation for at skrive dette instruerbare skyldes, at jeg fandt meget minimal information om, hvordan du opretter dine egne stiliserede kort fra bunden. Jeg håber at dele det, jeg har lært, med fællesskabet.

Ressourcer/links:

  • OpenStreetMap
  • OpenStreetMap Legalese
  • Github -depot

Forbrugsvarer

  • En Python -distribution (jeg brugte Anaconda & Python 3.6)
  • PyQt5 (til GUI -afhængigheder)

Trin 1: Definere processen I: Download af OSM -filen

Definere processen I: Download af OSM -filen
Definere processen I: Download af OSM -filen

Da jeg første gang begyndte dette projekt, var det mest åbenlyse spørgsmål, "hvor kan jeg få kortdata." Som du ville forvente, tænkte jeg straks på Google Maps. Efter omfattende forskning opdagede jeg, at Google virkelig ikke ønsker, at folk leger med deres data, i kreativ forstand eller på anden måde. Faktisk tillader de eksplicit web-scraping fra Google Maps.

Heldigvis var min fortvivlelse kort efter min opdagelse af OpenStreetMap (OSM). OSM er et samarbejdsprojekt, hvor mennesker over hele kloden bidrager med data. OSM tillader eksplicit åben anvendelse af deres data i navnet på Open Source-software. Som sådan er det at besøge OSM -websiden, hvor kortstiliseringsrejsen begynder.

Efter ankomsten til OSM -webstedet skal du klikke på fanen "Eksporter" for at vise korteksportværktøjerne. Zoom nu ind for at se det område, som du er interesseret i at indsamle kortdata med. Vælg linket "Vælg manuelt et andet område manuelt", som viser en boks på din skærm. Form og placer denne boks over området med interesse. Når du er tilfreds, skal du klikke på knappen "Eksporter" for at downloade din OSM -datafil.

Bemærk #1: Hvis din valgte region indeholder for mange data, får du en fejl, at du har valgt for mange noder. Hvis dette sker for dig, skal du klikke på knappen "Overpass API" for at downloade din større fil.

Bemærk #2: Hvis din downloadede OSM -fil er større end 30 MB, vil det Python -program, jeg skrev, mærkbart langsomt. Hvis du er fast besluttet på at bruge en stor region, kan du overveje at skrive et script for at smide overflødige data væk, som du ikke planlægger at tegne.

Trin 2: Definition af proces II: Forståelse af data

Definere proces II: Forståelse af data
Definere proces II: Forståelse af data
Definere proces II: Forståelse af data
Definere proces II: Forståelse af data
Definere proces II: Forståelse af data
Definere proces II: Forståelse af data
Definere proces II: Forståelse af data
Definere proces II: Forståelse af data

"Jeg har dataene … hvad nu?"

Start med at åbne din downloadede OSM -fil i din foretrukne tekstredigeringssoftware. Du vil først bemærke, at dette er en XML -fil, hvilket er fantastisk! XML er let nok til at analysere. Begyndelsen af din fil skal se næsten identisk ud med det første billede af dette trin - nogle grundlæggende metadata og geografiske grænser vil blive angivet.

Når du ruller filen, vil du bemærke tre dataelementer, der bruges overalt:

  1. Noder
  2. Måder
  3. Forhold

Det mest basale dataelement, en knude har simpelthen en unik identifikator, breddegrad og længdegrad, der er forbundet med det. Selvfølgelig er der yderligere metadata, men vi kan roligt kassere dem.

Måder er samlinger af noder. En måde kan gengives som en lukket form eller som en åben linje. Måder består af en samling af noder identificeret med deres unikke identifikator. De er mærket med nøgler, der definerer den datagruppe, de tilhører. For eksempel tilhører den måde, der er afbildet i det tredje billede ovenfor, datagruppen "sted" og dets undergruppe "ø". Med andre ord tilhører denne særlige måde "ø" -laget under gruppen "sted". Måder har også unikke identifikatorer.

Endelig er relationer samlinger af måder. En relation kan repræsentere en kompleks form med huller eller med flere områder. Forhold vil også have en unik identifikator og vil blive mærket på samme måde som måder.

Du kan læse mere om disse dataelementer fra OSM -wiki:

  • Noder
  • Måder
  • Forhold

Trin 3: Definition af proces III: Fordøjelse af data

Definere proces III: Fordøjelse af data
Definere proces III: Fordøjelse af data

Nu skal du have mindst en overfladisk forståelse af dataelementerne, der udgør en OSM -fil. På dette tidspunkt er vi interesserede i at læse OSM -dataene ved hjælp af dit valgsprog. Selvom dette trin er Python-centreret, skal du stadig læse denne del, hvis den ikke vil bruge Python, da den indeholder et par tips og tricks.

XML -pakken er som standard inkluderet i de fleste standard Python -distributioner. Vi vil bruge denne pakke til meget let at analysere vores OSM -fil som vist på det første billede. I en enkelt for loop kan du behandle håndteringen af OSM -data for hvert enkelt dataelement.

På billedets sidste linje vil du bemærke, at jeg søger efter mærket 'grænser'. Dette trin er afgørende for at oversætte værdier for breddegrad og længdegrad til pixels på skærmen. Jeg anbefaler stærkt at køre denne konvertering på det tidspunkt, du indlæser OSM -filen, da massekonvertering af data er procesintensiv.

Apropos konvertering af breddegrader og længdegrader til skærmkoordinater, her er et link til den beregningsfunktion, jeg skrev. Du vil sandsynligvis bemærke noget lidt mærkeligt ved at konvertere breddegrad til skærmkoordinater. Der er et ekstra trin involveret i forhold til længdegrad! Som det viser sig, er OSM-data modelleret ved hjælp af Pseudo-Mercator projektionsmetoden. Heldigvis har OSM fantastisk dokumentation om dette emne her, og de leverer breddegradskonverteringsfunktionerne til et betydeligt antal sprog. Fantastisk!

Bemærk: I min kode er skærmkoordinat (0, 0) det øverste venstre hjørne af skærmen.

Trin 4: Implementering af Python Map Stylizer

Implementering af Python Map Stylizer
Implementering af Python Map Stylizer
Implementering af Python Map Stylizer
Implementering af Python Map Stylizer
Implementering af Python Map Stylizer
Implementering af Python Map Stylizer

Indtil dette tidspunkt har jeg diskuteret OSM -datafilen - hvad det er, hvordan man læser det, og hvad man skal gøre med det. Nu vil jeg diskutere den software, jeg skrev til at tackle stilistisk kortvisualisering (GitHub -repo i introduktionen).

Min specifikke implementering fokuserer på brugerkontrol af rendering pipeline. Specifikt tillader jeg brugeren at vælge de lag, de vil have synlige, og hvordan de vil have det lag visualiseret. Som jeg kort nævnte tidligere, er der gengivet to klasser af elementer: udfyldningselementer og linjeposter. Udfyldninger defineres kun af en farve, mens linjer er defineret af farve, linjebredde, linjestil, stregstregstil og linjeforbindelsesstil.

Da brugeren foretager ændringer i lagstile og synlighed, afspejles ændringerne i kortwidgeten til højre. Når en bruger har ændret kortets udseende til sin tilfredshed, kan han justere den maksimale kortdimension og gemme kortet som et billede på sin computer. Ved lagring af et billede gemmes også en brugerkonfigurationsfil. Dette sikrer, at en bruger til enhver tid kan huske og genbruge den konfiguration, han brugte til at generere et bestemt billede.

Trin 5: Implementering Ulempe + løsning

Implementering Ulempe + løsning
Implementering Ulempe + løsning
Implementering Ulempe + løsning
Implementering Ulempe + løsning

Da jeg først begyndte at style et kort manuelt, lærte jeg, at dette var en ret kedelig proces. At tilbyde brugeren maksimal kontrol kan simpelthen være overvældende på grund af det store antal tilgængelige "knapper". Der er dog en enkel løsning, som indebærer lidt ekstra scripting.

Jeg startede med at identificere, hvilke lag jeg er særligt interesseret i. Med henblik på denne instruktive, lad os sige, at jeg er mest interesseret i bygninger (alle), floder, hovedveje og overfladegader. Jeg ville skrive et script, hvor jeg opretter en forekomst af konfiguration, skifter lagtilstande passende ved hjælp af funktionen setItemState () og definerede konstanter og angiver farver baseret på, hvordan jeg gerne vil have, at mine lag skal vises ved hjælp af setValue (). Den resulterende konfigurationsfil, der gemmes, kan kopieres til configs -mappen og indlæses af brugeren.

Et eksempel script er på billedet ovenfor. Det andet billede er et eksempel på, hvordan hjælperfunktionerne ville se ud, og da de stort set alle er identiske, bare med varierende konstanter, inkluderede jeg kun et billede af et eksempel.

Trin 6: Områder til forbedring

Områder til forbedring
Områder til forbedring

Efter at have reflekteret over min softwareimplementering har jeg identificeret flere områder, der ville være nyttige forbedringer for strømbrugere.

  1. Dynamisk laggengivelse. I øjeblikket har jeg en foruddefineret liste over lag, der vil blive gengivet, det er det. En del af begrundelsen var vanskeligheden ved at afgøre, om et lag skulle være en linje eller et fyld. Som følge heraf bliver du med næsten alle OSM -filer, du åbner, mødt med en masse advarsler om lag, der ikke gengives. Ofte er disse så minimale, at det ikke er et problem, men der mangler sikkert kritiske lag. Dynamisk laggengivelse ville fjerne disse bekymringer.
  2. Dynamisk lagtildeling. Dette går hånd i hånd med #1; Hvis du vil have dynamisk laggengivelse, har du brug for dynamisk lagtildeling (dvs. at identificere et fyldlag vs. et linjelag). Dette kunne med rimelighed opnås, som jeg har lært, fordi måder, hvis første og sidste knude er den samme, vil være lukkede stier og derfor udfyldes.
  3. Farve grupper. Et stiliseret kort har ofte flere lag, der har samme stil, og hvis brugeren kan ændre en gruppes stil på samme tid, vil det i høj grad reducere brugerens tid til at redigere lag en efter en.

Trin 7: Luk tanker

Afsluttende tanker
Afsluttende tanker
Afsluttende tanker
Afsluttende tanker
Afsluttende tanker
Afsluttende tanker

Tak til jer alle, fordi I tog jer tid til at læse min Instructable. Dette projekt repræsenterer kulminationen på mange timers forskning, design, programmering og fejlfinding. Jeg håber, at jeg har været i stand til at levere en startplade, hvorfra du kan bygge dit eget projekt eller bygge videre på det, jeg allerede har skrevet. Jeg håber også, at mine mangler og tips giver masser af punkter at overveje i dit design. Hvis du er mindre tilbøjelig til at programmere og mere tilbøjelig til at skabe kunstværker, vil jeg meget gerne se, hvad du laver i kommentarerne! Mulighederne er uendelige!

Særlig tak til OpenStreetMap -bidragyderne! Projekter som dette ville ikke være mulige uden deres store indsats.

Lad mig vide, hvis du har spørgsmål i kommentarerne!

Kortudfordring
Kortudfordring
Kortudfordring
Kortudfordring

Runner Up i Maps Challenge

Anbefalede: