Innholdsfortegnelse:

Hvordan lage tilpassede stiliserte kart ved hjelp av OpenStreetMap: 7 trinn (med bilder)
Hvordan lage tilpassede stiliserte kart ved hjelp av OpenStreetMap: 7 trinn (med bilder)

Video: Hvordan lage tilpassede stiliserte kart ved hjelp av OpenStreetMap: 7 trinn (med bilder)

Video: Hvordan lage tilpassede stiliserte kart ved hjelp av OpenStreetMap: 7 trinn (med bilder)
Video: Как заработать на YouTube с 5-минутным видео и зарабатыват... 2024, Juli
Anonim
Hvordan lage tilpassede stiliserte kart ved hjelp av OpenStreetMap
Hvordan lage tilpassede stiliserte kart ved hjelp av OpenStreetMap

I denne instruksen vil jeg beskrive en prosess der du kan generere dine egne skreddersydde stiliserte kart. Et stilisert kart er et kart der brukeren kan spesifisere hvilke datalag som skal visualiseres, samt definere stilen som hvert lag visualiseres med. Jeg vil først beskrive prosessen der du kan skrive programvare for å stilisere kart, etterfulgt av et eksempel på Python -programvaren jeg skrev for å utføre denne oppgaven.

Den følgende videoen fremhever hvordan jeg personlig genererer stiliserte kart, men fortsetter å lese for de intime detaljene. Jeg er veldig spent på å se hva fellesskapet skaper!

Hva er motivasjonen bak dette prosjektet?

Helt ærlig startet jeg dette prosjektet fordi jeg syntes det ville være morsomt å gjøre. Denne ideen har skramlet rundt i tankene mine det siste året, og jeg tok meg endelig den tiden jeg trengte for å få den til å fungere. Etter en dag med prototyping med noen grunnleggende skripting, var jeg i stand til å generere ekstremt lovende resultater - så lovende at jeg visste at jeg trengte å formalisere skriptene mine slik at andre enkelt kunne lage sine egne kreasjoner.

Min motivasjon for å skrive dette instruerbare skyldes det faktum at jeg fant veldig minimal informasjon om hvordan du lager dine egne stiliserte kart fra bunnen av. Jeg håper å dele det jeg har lært med samfunnet.

Ressurser/lenker:

  • OpenStreetMap
  • OpenStreetMap Legalese
  • Github -depot

Rekvisita

  • En Python -distribusjon (jeg brukte Anaconda & Python 3.6)
  • PyQt5 (for GUI -avhengighetene)

Trinn 1: Definere prosessen I: Nedlasting av OSM -filen

Definere prosessen I: Nedlasting av OSM -filen
Definere prosessen I: Nedlasting av OSM -filen

Da jeg først begynte med dette prosjektet, var det mest åpenbare spørsmålet, "hvor kan jeg få kartdata." Som du forventer, tenkte jeg umiddelbart på Google Maps. Etter omfattende undersøkelser oppdaget jeg at Google virkelig ikke vil at folk skal leke med dataene sine, i kreativ forstand eller på annen måte. Faktisk tillater de eksplisitt web-skraping fra Google Maps.

Heldigvis ble min fortvilelse kortvarig da jeg oppdaget OpenStreetMap (OSM). OSM er et samarbeidsprosjekt som involverer mennesker over hele verden som bidrar med data. OSM tillater eksplisitt åpen bruk av dataene deres i navnet på åpen kildekode-programvare. Som sådan er det å besøke OSM -nettstedet der kartstiliseringsturen begynner.

Etter at du har kommet til OSM -nettstedet, klikker du på "Eksporter" -fanen for å vise karteksportverktøyene. Zoom nå inn for å se regionen du er interessert i å samle kartdata med. Velg koblingen "Velg et annet område manuelt", som vil vise en boks på skjermen. Form og plasser denne boksen over området av interesse. Når du er fornøyd, klikker du på "Eksporter" -knappen for å laste ned OSM -datafilen.

Merknad 1: Hvis den valgte regionen inneholder for mye data, får du en feilmelding om at du har valgt for mange noder. Hvis dette skjer med deg, klikker du på "Overpass API" -knappen for å laste ned den større filen.

Merknad 2: Hvis den nedlastede OSM -filen din er større enn 30 MB, vil Python -programmet jeg skrev merkbart sakte. Hvis du er fast bestemt på å bruke en stor region, bør du vurdere å skrive et manus for å kaste overflødige data du ikke planlegger å tegne.

Trinn 2: Definere prosess II: Forstå dataene

Definere prosess II: Forstå dataene
Definere prosess II: Forstå dataene
Definere prosessen II: Forstå dataene
Definere prosessen II: Forstå dataene
Definere prosess II: Forstå dataene
Definere prosess II: Forstå dataene
Definere prosess II: Forstå dataene
Definere prosess II: Forstå dataene

"Jeg har dataene … hva nå?"

Begynn med å åpne den nedlastede OSM -filen i din favoritt tekstredigeringsprogramvare. Du vil først legge merke til at dette er en XML -fil, som er flott! XML er lett nok til å analysere. Begynnelsen på filen din bør se nesten identisk ut med det første bildet av dette trinnet - noen grunnleggende metadata og geografiske grenser vil bli oppført.

Når du blar i filen, vil du legge merke til tre dataelementer som brukes hele tiden:

  1. Noder
  2. Måter
  3. Forhold

Det mest grunnleggende dataelementet, en node har ganske enkelt en unik identifikator, breddegrad og lengdegrad knyttet til den. Selvfølgelig er det flere metadata, men vi kan trygt kaste dem.

Måter er samlinger av noder. En måte kan gjengis som en lukket form eller som en åpen linje. Måter består av en samling noder identifisert av deres unike identifikator. De er merket med nøkler som definerer datagruppen de tilhører. For eksempel tilhører måten avbildet i det tredje bildet ovenfor datagruppen "sted" og dens undergruppe "øy". Med andre ord tilhører denne spesielle måten "øya" -laget under "sted" -gruppen. Måter har også unike identifikatorer.

Til slutt er relasjoner samlinger av måter. En relasjon kan representere en kompleks form med hull eller med flere regioner. Relasjoner vil også ha en unik identifikator og vil bli merket på samme måte som måter.

Du kan lese mer om disse dataelementene fra OSM -wikien:

  • Noder
  • Måter
  • Forhold

Trinn 3: Definere prosess III: Fordøye dataene

Definere prosess III: Fordøye dataene
Definere prosess III: Fordøye dataene

Nå bør du ha minst en overfladisk forståelse av dataelementene som utgjør en OSM -fil. På dette tidspunktet er vi interessert i å lese OSM -dataene med ditt valgte språk. Selv om dette trinnet er Python-sentrisk, hvis du ikke vil bruke Python, bør du fortsatt lese denne delen, da den inneholder noen tips og triks.

XML -pakken er som standard inkludert i de fleste standard Python -distribusjoner. Vi vil bruke denne pakken til å enkelt analysere OSM -filen vår som vist i det første bildet. I en enkelt for løkke kan du behandle håndteringen av OSM -data for hvert enkelt dataelement.

På den siste linjen i bildet vil du legge merke til at jeg ser etter taggen 'grenser'. Dette trinnet er svært viktig for å oversette breddegrads- og lengdegrader til piksler på skjermen. Jeg anbefaler på det sterkeste å kjøre denne konverteringen på det tidspunktet du laster inn OSM -filen, ettersom massekonvertering av data er prosessintensiv.

Apropos konvertering av breddegrader og lengdegrader til skjermkoordinater, her er en lenke til beregningsfunksjonen jeg skrev. Du vil sannsynligvis legge merke til noe litt rart når du konverterer breddegrad til skjermkoordinater. Det er et ekstra trinn involvert i forhold til lengdegrad! Som det viser seg, er OSM-data modellert ved hjelp av Pseudo-Mercator-projiseringsmetoden. Heldigvis har OSM fantastisk dokumentasjon om dette emnet her, og de gir breddegradskonverteringsfunksjoner for et betydelig antall språk. Rått!

Merk: I min kode er skjermkoordinat (0, 0) det øvre venstre hjørnet av skjermen.

Trinn 4: Implementering av Python Map Stylizer

Implementering av Python Map Stylizer
Implementering av Python Map Stylizer
Implementering av Python Map Stylizer
Implementering av Python Map Stylizer
Implementering av Python Map Stylizer
Implementering av Python Map Stylizer

Frem til dette punktet har jeg diskutert OSM -datafilen - hva den er, hvordan den skal leses og hva jeg skal gjøre med den. Nå vil jeg diskutere programvaren jeg skrev for å håndtere stilistisk kartvisualisering (GitHub -repo i introduksjonen).

Min spesifikke implementering fokuserer på brukerkontroll av gjengivelsesrørledningen. Spesielt tillater jeg brukeren å velge lagene de vil ha synlige og hvordan de vil at laget skal visualiseres. Som jeg kort nevnte tidligere, er det to klasser av elementer som gjengis: fyllelementer og ordrelinjer. Fyll er bare definert med en farge, mens linjer er definert av farge, linjebredde, linjestil, linjestilstil og linjestil.

Etter hvert som brukeren gjør endringer i lagstiler og synlighet, gjenspeiles endringene i kartmodulen til høyre. Når en bruker har endret kartets utseende til sin tilfredshet, kan han justere den maksimale kartdimensjonen og lagre kartet som et bilde på datamaskinen. Når du lagrer et bilde, lagres også en brukerkonfigurasjonsfil. Dette sikrer at en bruker når som helst kan huske og bruke konfigurasjonen han brukte til å generere et bestemt bilde.

Trinn 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 begynte å style et kart manuelt, lærte jeg at dette var en ganske kjedelig prosess. Å tilby brukeren maksimal kontroll kan ganske enkelt være overveldende på grunn av det store antallet tilgjengelige "knotter". Imidlertid er det en enkel løsning, som innebærer litt ekstra skripting.

Jeg begynte med å identifisere hvilke lag jeg er spesielt interessert i. Med tanke på dette instruerbare, la oss si at jeg er mest interessert i bygninger (alle sammen), elver, hovedveier og overflategater. Jeg ville skrive et skript der jeg oppretter en forekomst av konfigurasjon, bytter lagstater på riktig måte ved hjelp av setItemState () -funksjonen og definerte konstanter, og angir farger basert på hvordan jeg vil at lagene mine skal vises ved hjelp av setValue (). Den resulterende konfigurasjonsfilen som blir lagret, kan kopieres til configs -mappen og lastes av brukeren.

Et eksempelskript er på bildet ovenfor. Det andre bildet er et eksempel på hvordan hjelperfunksjonene ville se ut, og siden de i utgangspunktet alle er identiske, bare med varierende konstanter, inkluderte jeg bare et bilde av ett eksempel.

Trinn 6: Forbedringsområder

Forbedringsområder
Forbedringsområder

Etter å ha reflektert over programvareimplementeringen min, har jeg identifisert flere områder som ville være nyttige forbedringer for strømbrukere.

  1. Dynamisk gjengivelse av lag. Foreløpig har jeg en forhåndsdefinert liste over lag som skal gjengis, det er det. En del av begrunnelsen var vanskeligheten med å avgjøre om et lag skulle være en linje eller et fyll. Som et resultat, vil du med nesten hver OSM -fil du åpner bli møtt med en rekke advarsler om lag som ikke blir gjengitt. Ofte er disse så minimale at det ikke er et problem, men det mangler sikkert kritiske lag. Dynamisk gjengivelse av lag ville eliminere disse bekymringene.
  2. Dynamisk lagoppgave. Dette går hånd i hånd med #1; hvis du vil ha dynamisk laggjengivelse, trenger du dynamisk lagtildeling (dvs. identifisere et fyllingslag vs. et linjelag). Dette kan jeg med rimelighet oppnå, som jeg har lært, fordi måter hvis første og siste node er den samme, vil være lukkede stier og derfor fylt.
  3. Fargegrupper. Et stilisert kart har ofte flere lag som har samme stil, og hvis du gjør det mulig for brukeren å endre en gruppestil samtidig, vil det redusere brukerens tid på å redigere lag en for en.

Trinn 7: Avsluttende tanker

Avsluttende tanker
Avsluttende tanker
Avsluttende tanker
Avsluttende tanker
Avsluttende tanker
Avsluttende tanker

Takk til alle som tok seg tid til å lese gjennom instruksjonsboken min. Dette prosjektet representerer kulminasjonen på mange timer med forskning, design, programmering og feilsøking. Jeg håper jeg har vært i stand til å skaffe en startpute hvor du kan bygge ditt eget prosjekt eller bygge på det jeg allerede har skrevet. Jeg håper også at mine mangler og tips gir mange punkter å vurdere i designet ditt. Hvis du er mindre tilbøyelig til å programmere og mer tilbøyelig til å lage kunstverk, vil jeg gjerne se hva du gjør i kommentarene! Mulighetene er endeløse!

Spesiell takk til OpenStreetMap -bidragsyterne! Slike prosjekter ville ikke vært mulig uten deres store innsats.

Gi meg beskjed hvis du har spørsmål i kommentarene!

Kartutfordring
Kartutfordring
Kartutfordring
Kartutfordring

Andreplass i kartutfordringen

Anbefalt: