INHOUDSOPGAWE:

Hoe om aangepaste gestileerde kaarte te maak met behulp van OpenStreetMap: 7 stappe (met foto's)
Hoe om aangepaste gestileerde kaarte te maak met behulp van OpenStreetMap: 7 stappe (met foto's)

Video: Hoe om aangepaste gestileerde kaarte te maak met behulp van OpenStreetMap: 7 stappe (met foto's)

Video: Hoe om aangepaste gestileerde kaarte te maak met behulp van OpenStreetMap: 7 stappe (met foto's)
Video: 8 инструментов в Excel, которыми каждый должен уметь пользоваться 2024, November
Anonim
Hoe om aangepaste gestileerde kaarte te skep met behulp van OpenStreetMap
Hoe om aangepaste gestileerde kaarte te skep met behulp van OpenStreetMap

In hierdie instruksies sal ek 'n proses beskryf waarmee u u eie gestileerde kaarte kan maak. 'N Gestileerde kaart is 'n kaart waar die gebruiker kan spesifiseer watter datalag gevisualiseer word, asook die styl waarmee elke laag gevisualiseer word, kan definieer. Ek sal eers die proses beskryf waardeur u sagteware kan skryf om kaarte te styl, gevolg deur 'n voorbeeld van die Python -sagteware wat ek geskryf het om hierdie taak uit te voer.

Die volgende video beklemtoon hoe ek persoonlik gestileerde kaarte genereer, maar ek bly lees vir die intieme besonderhede. Ek is baie opgewonde om te sien wat die gemeenskap skep!

Wat is my motivering agter hierdie projek?

Eerlik gesê, ek het hierdie projek begin omdat ek gedink het dit sou lekker wees om te doen. Hierdie idee het die afgelope jaar in my gedagtes rondgerits, en ek het uiteindelik die tyd geneem wat ek nodig gehad het om dit te verwesenlik. Na 'n dag van prototipe met basiese skrif, kon ek uiters belowende resultate lewer - so belowend dat ek geweet het dat ek my skrifte sou moet formaliseer sodat ander maklik hul eie skeppings kon maak.

My motivering om hierdie instruksies te skryf, is te danke aan die feit dat ek baie min inligting gevind het oor hoe u u eie gestileerde kaarte van nuuts af kan skep. Ek hoop om dit wat ek geleer het met die gemeenskap te deel.

Hulpbronne/skakels:

  • OpenStreetMap
  • OpenStreetMap Legalese
  • Github -bewaarplek

Voorrade

  • 'N Python -verspreiding (ek het Anaconda en Python 3.6 gebruik)
  • PyQt5 (vir die GUI -afhanklikhede)

Stap 1: Definieer die proses I: Die aflaai van die OSM -lêer

Definieer die proses I: Die aflaai van die OSM -lêer
Definieer die proses I: Die aflaai van die OSM -lêer

Toe ek die eerste keer met hierdie projek begin, was die mees opvallende vraag: "Waar kan ek kaartdata kry?" Soos u sou verwag het ek natuurlik onmiddellik aan Google Maps gedink. Na deeglike navorsing het ek agtergekom dat Google regtig nie wil hê dat mense in hul kreatiewe sin met hul data speel nie. Trouens, hulle verbied webskraap uitdruklik uitdruklik uit Google Maps.

Gelukkig was my wanhoop van korte duur toe ek OpenStreetMap (OSM) gevind het. OSM is 'n samewerkingsprojek waarby mense oor die hele wêreld data bydra. OSM laat eksplisiet oop gebruik van hul data toe in die naam van Open Source-sagteware. As sodanig begin die besoek aan die OSM -webwerf waar die kaartstilisering begin.

Nadat u by die OSM -webwerf aangekom het, klik op die oortjie "Uitvoer" om die kaartuitvoergereedskap te wys. Zoom nou in om die gebied te sien waarmee u kaartdata wil versamel. Kies die skakel "Kies handmatig 'n ander gebied", wat 'n boks op u skerm vertoon. Vorm en plaas hierdie boks oor die belangegebied. As u tevrede is, klik op die knoppie "Uitvoer" om u OSM -datalêer af te laai.

Opmerking #1: As u gekose streek te veel data bevat, sal u 'n fout ontvang dat u te veel nodusse gekies het. As dit met u gebeur, klik dan op die "Oorgang API" -knoppie om u groter lêer af te laai.

Opmerking #2: As u afgelaaide OSM -lêer groter as 30MB is, sal die Python -program wat ek geskryf het, merkbaar vertraag word. As u vasbeslote is om 'n groot gebied te gebruik, oorweeg dit om 'n script te skryf om oortollige data wat u nie van plan is om te teken, weg te gooi.

Stap 2: Definisie van die proses II: Begrip van die data

Definisie van die proses II: Begrip van die data
Definisie van die proses II: Begrip van die data
Definisie van die proses II: Begrip van die data
Definisie van die proses II: Begrip van die data
Definisie van die proses II: Begrip van die data
Definisie van die proses II: Begrip van die data
Definisie van die proses II: Begrip van die data
Definisie van die proses II: Begrip van die data

"Ek het die data … wat nou?"

Begin deur u afgelaaide OSM -lêer in u gunsteling teksbewerkingsagteware oop te maak. U sal eers sien dat dit 'n XML -lêer is, wat wonderlik is! XML is maklik genoeg om te ontleed. Die begin van u lêer behoort byna identies te lyk aan die eerste prentjie van hierdie stap - 'n paar basiese metadata en geografiese grense word gelys.

As u deur die lêer blaai, sien u drie data -elemente wat deurgaans gebruik word:

  1. Knope
  2. Maniere
  3. Verhoudings

Die mees basiese data -element, 'n knoop, het eenvoudig 'n unieke identifiseerder, breedtegraad en lengtegraad wat daarmee gepaard gaan. Daar is natuurlik ekstra metadata, maar ons kan dit veilig weggooi.

Maniere is versamelings van nodusse. 'N Manier kan weergegee word as 'n ingeslote vorm of as 'n oop lyn. Maniere bestaan uit 'n versameling nodusse wat deur hul unieke identifiseerder geïdentifiseer word. Hulle is gemerk met sleutels wat die datagroep waartoe hulle behoort definieer. Byvoorbeeld, die manier waarop in die derde prent hierbo afgebeeld word, behoort tot die datagroep 'plek' en die subgroep 'eiland'. Met ander woorde, hierdie spesifieke manier behoort tot die 'eiland' -laag onder die' plek' -groep. Maniere het ook unieke identifiseerders.

Laastens is verhoudings versamelings van maniere. 'N Verhouding kan 'n komplekse vorm met gate of met verskeie streke voorstel. Verhoudings sal ook 'n unieke identifiseerder hê en sal op dieselfde manier as metodes gemerk word.

U kan meer lees oor hierdie data -elemente uit die OSM -wiki:

  • Knope
  • Maniere
  • Verhoudings

Stap 3: Definieer die proses III: vertering van die data

Definieer die proses III: vertering van die data
Definieer die proses III: vertering van die data

Nou moet u ten minste 'n oppervlakkige begrip hê van die data -elemente waaruit 'n OSM -lêer bestaan. Op die oomblik is ons geïnteresseerd in die lees van die OSM -data met behulp van u taal van keuse. Hierdie stap is Python-sentries, maar as u nie Python wil gebruik nie, moet u hierdie gedeelte steeds lees, aangesien dit 'n paar wenke en truuks bevat.

Die xml -pakket is standaard ingesluit by die meeste standaard Python -verspreidings. Ons sal hierdie pakket gebruik om ons OSM -lêer maklik te ontleed, soos in die eerste prent getoon. In 'n enkele lus kan u die hantering van OSM -data vir elke spesifieke data -element verwerk.

Op die laaste reël van die prentjie sal u sien dat ek kyk of die tag 'grense' is. Hierdie stap is uiters belangrik om die breedte- en lengtegraadwaardes in pixels op die skerm te vertaal. Ek beveel sterk aan om hierdie omskakeling uit te voer ten tyde van die laai van die OSM -lêer, aangesien die massaomskakeling van data prosesintensief is.

Van die omskakeling van breedtegrade en lengtes in skermkoördinate, hier is 'n skakel na die berekeningsfunksie wat ek geskryf het. U sal waarskynlik iets effens vreemds opmerk wanneer u breedtegraad omskakel na skermkoördinate. Daar is 'n ekstra stap in vergelyking met lengtegraad! Soos dit blyk, word OSM-data gemodelleer volgens die Pseudo-Mercator-projeksiemetode. Gelukkig het OSM hier fantastiese dokumentasie oor hierdie onderwerp, en dit bied die breedtegraad -omskakelingsfunksies vir 'n aansienlike aantal tale. Ontsagwekkende!

Nota: In my kode is die skermkoördinaat (0, 0) in die boonste linkerhoek van die skerm.

Stap 4: Implementering van Python Map Stylizer

Implementering van Python Map Stylizer
Implementering van Python Map Stylizer
Implementering van Python Map Stylizer
Implementering van Python Map Stylizer
Implementering van Python Map Stylizer
Implementering van Python Map Stylizer

Tot op hierdie stadium het ek die OSM -datalêer bespreek - wat dit is, hoe om dit te lees en wat om daarmee te doen. Nou sal ek die sagteware bespreek wat ek geskryf het om stilistiese kaartvisualisering aan te pak (GitHub repo in die inleiding).

My spesifieke implementering fokus op gebruikersbeheer van die leweringspyplyn. Ek laat die gebruiker spesifiek toe om die lae te kies wat hulle wil sien en hoe hy wil hê dat die laag gevisualiseer moet word. Soos ek vroeër kortliks genoem het, is daar twee klasse elemente: vullingsitems en reëlitems. Vullings word slegs deur 'n kleur gedefinieer, terwyl lyne gedefinieer word deur kleur, lynwydte, lynstyl, reëlskapstyl en styllyn.

Aangesien die gebruiker wysigings aan laagstyle en sigbaarheid aanbring, word die veranderinge weerspieël in die kaart -widget aan die regterkant. Sodra 'n gebruiker die voorkoms van die kaart na tevredenheid verander het, kan hy die maksimum kaartafmeting aanpas en die kaart as 'n beeld op sy rekenaar stoor. By die stoor van 'n prentjie word 'n gebruikersopsetlêer ook gestoor. Dit verseker dat 'n gebruiker die opset wat hy gebruik het om 'n bepaalde beeld te genereer, te eniger tyd kan herroep en hergebruik.

Stap 5: Implementasie -nadeel + oplossing

Implementasie nadeel + oplossing
Implementasie nadeel + oplossing
Implementasie nadeel + oplossing
Implementasie nadeel + oplossing

Toe ek die eerste keer 'n kaart met die hand begin stiliseer, het ek geleer dat dit 'n taamlik vervelige proses was. Die maksimum beheer van die gebruiker kan eenvoudig oorweldigend wees as gevolg van die groot aantal beskikbare 'knoppe'. Daar is egter 'n eenvoudige oplossing, wat 'n bietjie ekstra skrif behels.

Ek het begin deur te identifiseer in watter lae ek veral belangstel. Vir die doel van hierdie instruksies, laat ons sê dat ek die meeste belangstel in geboue (almal), riviere, hoofweë en oppervlakstrate. Ek sou 'n script skryf waar ek 'n instansie van Configuration skep, die laattoestande op die regte manier wissel met behulp van die setItemState () -funksie en gedefinieerde konstantes, en kleure stel op grond van hoe ek wil hê dat my lae met die setValue () verskyn. Die gevolglike konfigurasie lêer wat gestoor word, kan in die configs -gids gekopieer word en deur die gebruiker gelaai word.

'N Voorbeeldskrif is in die prent hierbo. Die tweede beeld is 'n voorbeeld van hoe die helperfunksies sou lyk, en omdat hulle basies almal identies is, net met verskillende konstantes, het ek slegs 'n prentjie van een voorbeeld ingesluit.

Stap 6: Verbeteringsgebiede

Gebiede vir verbetering
Gebiede vir verbetering

Nadat ek besin het oor my sagteware -implementering, het ek verskeie gebiede geïdentifiseer wat handige verbeterings vir kraggebruikers kan wees.

  1. Dinamiese laagweergawe. Tans het ek 'n vooraf gedefinieerde lys van lae wat weergegee sal word, dit is dit. Deel van die regverdiging was die moeilikheid om te bepaal of 'n laag 'n lyn of 'n vulsel moet wees. Gevolglik word u byna elke OSM -lêer wat u oopmaak, begroet met 'n rits waarskuwings oor lae wat nie weergegee sal word nie. Dikwels is dit so minimaal dat dit nie 'n probleem is nie, maar daar sal beslis kritieke lae ontbreek. Dinamiese laagweergawe sal hierdie probleme uitskakel.
  2. Dinamiese laag toewysing. Dit gaan hand-aan-hand met #1; As u 'n dinamiese laagweergawe wil hê, benodig u 'n dinamiese laagtoewysing (dws die identifisering van 'n vullaag teenoor 'n reëllaag). Dit kan redelik bereik word, soos ek geleer het, want maniere waarvan die eerste en laaste knoop dieselfde is, sal omheinde paaie wees en dus gevul word.
  3. Kleurgroepe. 'N Gestileerde kaart het dikwels verskeie lae wat dieselfde styl het, en die gebruiker in staat stel om die styl van 'n groep tegelyk te verander, sal die gebruiker se tyd wat hy aan die wysig het, een vir een aansienlik verminder.

Stap 7: Afsluiting van gedagtes

Slotgedagtes
Slotgedagtes
Slotgedagtes
Slotgedagtes
Slotgedagtes
Slotgedagtes

Dankie vir almal wat die tyd geneem het om deur my Instructable te lees. Hierdie projek verteenwoordig die hoogtepunt van baie ure se navorsing, ontwerp, programmering en ontfouting. Ek hoop dat ek 'n lanseerplank kon bied waaruit u u eie projek kan bou of kan voortbou op wat ek reeds geskryf het. Ek hoop ook dat my tekortkominge en wenke baie punte in u ontwerp moet in ag neem. As u minder geneig is om te programmeer en meer geneig is om kunswerke te skep, wil ek graag sien wat u in die kommentaar lewer! Die moontlikhede is eindeloos!

Spesiale dank aan die bydraers van OpenStreetMap! Sulke projekte sou sonder hul groot inspanning nie moontlik wees nie.

Laat weet my asseblief as u vrae in die kommentaar het!

Kaartuitdaging
Kaartuitdaging
Kaartuitdaging
Kaartuitdaging

Naaswenner in die kaartuitdaging

Aanbeveel: