In onze vorige zelfstudie hebben we gekeken hoe u markeringen kunt toevoegen en de kleuren en menu's van een Google-kaart kunt aanpassen met behulp van de API van de service. Deze tutorial gaat een stap verder en legt uit hoe je je eigen aangepaste kaart kunt maken en bedekking het op een Google-kaart (zoals mijn 1896 kaart van Portsmouth).
In deze zelfstudie voegen we een 'weersvoorspellingen'-overlay toe aan de kaart die we eerder hebben gemaakt. De weerkaart die ik gebruik is volledig fictief, maar de technieken die worden behandeld geven je de vrijheid om allerlei interessante dingen te maken! Je zult in staat zijn om historische kaarten, op maat gemaakte kaarten, close-ups van specifieke gebieden zoals een universiteitscampus te bouwen - de lijst is eindeloos!
Een paar dingen die u moet weten voordat u begint:
Deze tutorial legt elke stap uit, inclusief de softwaretools die (gelukkig!) Beschikbaar zijn om dingen te automatiseren en het leven een stuk eenvoudiger te maken. De bronbestanden voor elke stap zijn beschikbaar in het downloadpakket.
Om te beginnen, is de eerste stap om een sjabloon te maken waarop u uw eigen overlay kunt maken.
Sjabloonafbeelding waarin u uw kaart maakt. Deze afbeelding is eigenlijk 9984x11776 pixelsUw doel is om een sjabloon te maken in Photoshop (of een vergelijkbare grafische toepassing) die exact dezelfde grootte en vorm heeft als de Google-kaart waar u het bovenop wilt plaatsen, wanneer het op zijn hoogste zoomniveau. (maptiler.org is handig als je niet zeker weet wat het hoogste zoomniveau is dat je nodig hebt).
Hiertoe kunt u een sjabloontoewijzing opslaan met de mashup van de maptiler en deze vervolgens in Photoshop vergroten tot het gewenste maximale zoomniveau. Bijvoorbeeld:
In dit stadium zal ik dingen niet ingewikkeld maken! Dus bij een kleine wijziging in de vorige zelfstudie, heb ik het maximale zoomniveau gewijzigd van 12 in 10 om ons een beheersbare bestandsgrootte te geven om mee te werken.
Zodra u uw jpg-kaart hebt met behulp van het hierboven beschreven proces, opent u deze in Photoshop of uw gewenste grafische toepassing.
Je gebruikt deze afbeelding als een sjabloon en tekent er je eigen kaart bovenop. Dit is om ervoor te zorgen dat uw kaart perfect aansluit bij de Google-kaart.
Kijk eens naar de weerkaartafbeelding die ik in deze fase heb gemaakt, die beschikbaar is in de brondownload.
Er zijn een aantal manieren waarop u uw afbeelding kunt indelen om de kaarttegels te maken. Als je een beetje achtergrondinformatie wilt over wat je aan het doen bent, lees dan verder. Anders, als het u niet uitmaakt waarom of hoe het werkt, gaat u gewoon door naar het volgende gedeelte!
Een projectiesysteem, in de geografische zin, is hoe een platte kaart wordt gemaakt van een rond object, d.w.z. de globe. Er zijn allerlei (ronduit verbijsterende) formules en algoritmen om dit te bereiken. Het enige dat u moet weten, is dat verschillende projectiesystemen resulteren in verschillende platte kaarten van de wereld.
Mercator-projectie (boven) en de Gall-Peters-projectie (onder) creëren behoorlijk verschillende tweedimensionale kaarten. (De rasters op de bovenstaande afbeeldingen zijn niet gerelateerd aan de Google-kaarttegels, die vierkant zijn).Om een overlapping voor een Google-kaart te maken, moet u het 'sferische Mercator'-systeem gebruiken dat de Mercator-projectie gebruikt. Dit wordt gedefinieerd als EPSG: 900913 of EPSG: 3857. Voor meer informatie over projectiesystemen, zie de webpagina Tiles à la Google Maps.
Voordat u uw tegels kunt genereren, moet u de positie van de noord-, zuid-, west- en oostzijde van uw kaart bepalen. Omdat u het 'sferische Mercator'-systeem gebruikt, moeten deze in sferische meters zijn in tegenstelling tot de breedtegraad of lengtegraad.
U kunt deze positiewaarden vinden met behulp van deze mashup. Ik heb gemerkt dat de eenvoudigste methode is om in te zoomen en een zijde tegelijk te vinden. Zoek dus de waarde voor de westkant van je kaart, maak er een notitie van, en vind de waarde voor de zuidkant, enzovoort.
Zodra u deze vier waarden hebt gevonden, kunt u uw kaart nu in tegels verdelen. Er zijn een aantal opties beschikbaar.
Gelukkig is de MapTiler-software heel eenvoudig te gebruiken! Op het moment dat deze tutorial wordt geschreven, werkt MapTiler hun software bij. Maar ongeacht welke versie u downloadt, dit zijn de basisstappen:
Notitie: Als u de nieuwe versie van MapTiler gebruikt, is er een kaart; je kaarttegels hebben een watermerk. Ik vermoed dat in sommige gevallen, misschien voor een Uni-project of technische proof-of-concept, dit toch geen probleem is. Er zijn echter een aantal manieren om dit te omzeilen. De meest voor de hand liggende manier is om de upgrade voor $ 20 te kopen geloof ik. De andere optie is om het Pythonscript van GDAL2Tiles te gebruiken. Mijn persoonlijke voorkeur gaat uit naar de upgrade, omdat ik veel liever mijn tijd aan het creatieve spul zou besteden, dan aan het irriteren van het instellen van de scriptingomgeving, maar je voelt je misschien anders.
Tip: Als u problemen ondervindt bij het gebruik van de MapTiler-software, dan is het gebruikersforum uiterst nuttig.Een alternatief voor MapTiler is het script GDAL2Tiles. De MapTiler-software is eigenlijk bovenop dit script gebouwd, dat door de interface van de opdrachtprompt loopt.
GDAL2Tiles is het Python-script dat de kern vormt van de MapTiler GUI. U kunt dit script rechtstreeks gebruiken via de opdrachtprompt-interface.GDAL2Tiles biedt nog meer mogelijkheden, maar het is ook een beetje lastiger om te gebruiken; dus lees alleen verder als je een gevoel van avontuur hebt!
De eerste stap is het opzetten van de omgeving om het GDAL2Tiles-script uit te voeren. Hoe u dit doet, is afhankelijk van uw besturingssysteem. Als u een 32-bit Windows-machine gebruikt (klik hier als u het niet zeker weet), dan kunt u OSGeo4W gebruiken..
Als u een 64-bits Windows-machine gebruikt (klik hier als u het niet zeker weet), is de installatie iets anders. Deze instructies staan (met vriendelijke toestemming) rechtstreeks op de blog van Jaerock Kwon, die alle eer verdient voor het geven van dergelijke gedetailleerde instructies.
Dus ervan uitgaande dat je het (soms traumatische!) Proces van het opzetten van de GDAL2Tiles-softwareomgeving hebt doorstaan, is het tijd om er iets mee te doen.
De opdrachtprompt van GDAL. De OSGeo4W lijkt hier erg op. De opdrachten zijn hetzelfde voor beide.Of u nu de OSGeo4W- of de GDAL-omgeving gebruikt, uw opdrachtprompt moet er ongeveer zo uitzien als de bovenstaande schermafbeelding. U kunt nu beginnen met het script GDAL2Tiles te gebruiken.
Eerst moet u naar de map navigeren waar de kaart die u wilt opdelen wordt opgeslagen. (Deze commando's zijn handig om te krijgen waar je moet zijn: dir
geeft je een lijst met alles in de huidige map, CD
betekent map wijzigen, CD…
betekent één niveau hoger in de boom bewegen).
Als je eenmaal in de juiste map bent, kun je beginnen met het maken van je tegels. Om de demokaart in deze zelfstudie te maken, zijn dit de opdrachten die ik heb gebruikt -
gdal_translate -of VRT -a_srs EPSG: 900913 -gcp 0 0 -910307.6791052371 8109796.717743561 -gcp 7248 0 196252.07012218982 8109796.717743561 -gcp 7248 10929 196252.07012218982 6438749.514630105 part2_rainfall_map.png out.vrt
gdal2tiles.py -p mercator -z 6-10 out.vrt
Zie de. Om uit te leggen wat deze opdrachten aan het doen zijn gdal_translate
pagina en de gdal2tiles.py
pagina. Er is ook een GDAL-warp-opdracht die nauw verwant is, maar in dit geval is dit niet nodig. Een paar dingen om op te merken zijn:
-gcp
eigenschappen hebben betrekking op drie hoeken van uw kaart. Het eerste paar waarden na elk gcp
eigenschap heeft betrekking op de afmetingen in pixels van uw invoerafbeeldingsbestand en het tweede paar waarden zijn de coördinaten in bolvormige meters (niet lengte- en breedtegraad - zie hierboven).Dus om dit op je kaart toe te passen:
gdal_translate -of VRT -a_srs EPSG: 900913 -gcp 0 0 west noord -gcp width_of_your_input_map_file_in_pixels 0 oost noord -gcp width_of_your_input_map_file_in_pixels height_of_your_input_map_file_in_pixels east south your_input_file_name.png your_output_file_name.vrt
gdal2tiles.py -p mercator -z zoom_range name_of_output_file.vrt
Nadat je de tweede opdracht hebt geactiveerd, komt je computer tot leven en begin je je afbeelding te verkleinen om de kaarttegels te maken. Misschien wilt u eens kijken naar de exacte opdrachten die ik in de OSGeo4W- en de GDAL-omgeving heb getypt als u niet zeker weet hoe u door de mappen navigeert met behulp van de opdrachtprompt.
Ongeacht de methode die u gebruikte om uw tegels te genereren, zullen de gegenereerde mappen hetzelfde zijn.
Alle tegels op een Google-kaart hebben de waarde 'x' en 'y'. (Ja - nog een ander ander coördinatensysteem!) Het eerste niveau van mappen is het zoomniveau, dan is binnen dat het volgende niveau van mappen de 'x' coördinaat, en daarbinnen is de bestandsnaam de 'y'-coördinaat.
Als u de kaart op deze website bekijkt, zou u moeten zien dat de namen van uw tegels overeenkomen. Ga met andere woorden naar de gewenste locatie, pas het zoomniveau aan zodat het overeenkomt met uw mapnaam en kijk vervolgens naar de x- en y-waarden van Google. U zou moeten zien dat ze overeenkomen met uw submap en bestandsnamen voor de corresponderende kaarttegels.
Om te controleren of uw tegels in orde zijn, raad ik u ten zeerste aan om één of twee tegels die zijn gegenereerd voor het laagste zoomniveau terug te kopiëren naar uw kaartbestand (bijvoorbeeld het Photoshop-bestand) dat in de vorige fase is gemaakt. Controleer of ze precies op uw kaart passen. Neem een kijkje in de bronbestanden die ik heb verstrekt voor een voorbeeld hiervan.
Als alles goed is, dan - gefeliciteerd - is het harde werk gedaan!
Oh jee. Dit gebeurt als u de oudere versie van de MapTiler-software of het script GDAL2Tiles hebt gebruikt. Uw bestanden (maar niet de mappen) worden genoemd met de naamgevingsconventie van TMS. Als u de tegels op deze pagina bekijkt, kunt u zien dat elke tegel twee x- en y-waarden heeft; d.w.z. een Google-paar en een TMS-paar. We moeten ze gewoon hernoemen naar de naamgevingsconventie voor Google-kaarten.
Dit hernoemen kan handmatig gebeuren, maar het zal veel te lang duren voor de meeste kaarten. Gelukkig is er een handig shellscript dat het werk voor je zal doen. U moet iets weten over de meest elementaire Linux-opdrachten, zoals het wijzigen van de map. Maak voordat je het shell-script uitvoert een kopie van je tegels om aan te werken.
#! / bin / sh voor thisPath in 'ls -d * / * / *' do thisFile = $ thisPath # * / * / oldY = $ thisFile% .png zoomX = $ thisPath% / * zoom = $ thisPath% / * / * newY = $ (((1<Kopieer en plak het bovenstaande script in Kladblok en sla het op met de naam 'hernoemen' en de extensie '.sh'. Zorg ervoor dat bij het opslaan van het 'sh'-bestand in Kladblok' alle bestanden 'naast' Opslaan als type 'is geselecteerd en zet de naam tussen aanhalingstekens, bijvoorbeeld “Rename.sh”.
Als u een Mac gebruikt, kan dit shellscript in Terminal worden uitgevoerd (selecteer toepassingen dan nutsbedrijven dan Terminal).
Als u op een Windows-computer werkt, moet u voor het uitvoeren van shellscripts (of '.sh'-bestanden) Cygwin gebruiken, wat een Linux-achtige omgeving voor Windows is:
- Download en installeer Cygwin
- Kopieer het bestand 'rename.sh' dat u zojuist in de map cygwin \ bin hebt opgeslagen.
- Start Cygwin.
- Ga naar de cygwin \ bin map. (d.w.z.
CD
betekent map wijzigen,CD…
betekent op één niveau omhooggaan, enls
middelen tonen de bestanden en mappen in de huidige map.)- Maak rename.sh uitvoerbaar door te draaien
chmod 755 hername.sh
- Je moet het ook omzetten naar een Linux-bestand voordat je het uitvoert, anders krijg je '\ r' fouten veroorzaakt door de regeleinden. Dus ren erover dat je nog steeds in de cygwin \ bin map en uitvoeren
d2u hername.sh
- Ga vervolgens naar de map met uw tegels (zie de schermafbeelding hierboven).
- Typ vervolgens om het script uit te voeren
rename.sh
Nadat het shellscript is uitgevoerd, kunt u controleren of de taak is voltooid door nog een keer naar uw bestanden te kijken. Controleer of hun namen nu overeenkomen met de Google-coördinaten op deze pagina.
Als u de bestandsnamen in de mappen 'Deel 3-bestanden' en de map 'Deel 4-bestanden' in de bronbestanden vergelijkt, ziet u het verschil.
Uw kaarttitels comprimeren
Om ervoor te zorgen dat uw kaart zo soepel mogelijk werkt, kunt u uw kaarttegels comprimeren.
Er zijn verschillende gratis compressieprogramma's voor png-afbeeldingen, maar ik had moeite (en faalde) om er een te vinden die volledig gratis was en het werk deed. De populaire PNGGauntlet-software bewaarde bijvoorbeeld niet de mapstructuur, terwijl andere gratis hulpprogramma's een limiet op het maximale aantal bestanden hadden.
Uiteindelijk moest ik bijtanken en de PNGOUTWin-software kopen. Dit kost ongeveer £ 10, wat een koopje is gezien de faffing rond dat het bespaard! PNGOUTWin behoudt allebei de bestandsstructuur en laat je al je bestanden in één keer comprimeren.
Als u PNGOUTWin gebruikt, is het vrij intuïtief. Mijn enige waarschuwing is dat je een kopie van je tegels moet maken en de software vervolgens op de kopie moet uitvoeren. Let er ook op dat de software letterlijk start zodra u de map hebt geselecteerd!
JavaScript Magic om alles samen te brengen
Oké, we zijn er bijna. Het enige dat overblijft is de kleine kwestie van het bevestigen van je mooie nieuwe kaarttegels aan je Google-kaart.
De basiscode
Bekijk eerst een eenvoudig voorbeeld van een overlay met een betegelde kaart (bronbestanden zijn beschikbaar via de link bovenaan deze pagina).
Als u in- en uitzoomt, blijft de kaart-overlay behouden.
// instellen van de overlay met de regenkaart var rainMapOverlay = new google.maps.ImageMapType (getTileUrl: function (coord, zoom) return 'tiles / rainfall' + '/' + zoom + '/' + coord.x + '/' + coord.y + '. png';, tileSize: new google.maps.Size (256, 256));Dit fragment gebruikt de klasse ImageMapType om de aangepaste overlay te maken. De
coord.x
heeft betrekking op de mapnaam en decoord.y
heeft betrekking op de bestandsnaam. Deze worden samengevoegd in de code om het pad naar elke tegel te maken.Aansluiten op de UK Festival Map
Dit is het uiteindelijke product waarnaar u streeft. Om dit te maken, kunt u dezelfde technieken gebruiken die aan het einde van de vorige zelfstudie zijn uitgelegd.
We maken eerst een variabele (
rainfallOverlayToggle
) om aan te geven of de weer-overlay momenteel wordt getoond of niet. En vervolgens een nieuwe optie maken in dehandelRequests
functie om te gaan met de situatie wanneer de paraplu-knop (parasol
) is geklikt.// Geeft de neerslagkaart weer wanneer op de knop unbrella wordt geklikt en deze wordt verwijderd als deze al wordt weergegeven. else if (buttonPressed === "rainfall") // Als de regenkaart NIET permanent wordt weergegeven, laat deze dan zien ... if (rainfallOverlayToggle === 0) // overlapt de neerslagkaart bovenop het kaartmapfestivalMap.overlayMapTypes .insertAt (0, rainMapOverlay); // Toon de weersleutel. festivalMap.controls [google.maps.ControlPosition.TOP_LEFT] .Schuif (weatherKeyDiv); rainfallOverlayToggle = 1; // Als de kaart met regenval al wordt weergegeven, verberg deze dan ... anders // verwijder de overlaykaart. festivalMap.overlayMapTypes.removeAt (0, rainMapOverlay); // verwijder de weercode festivalMap.controls [google.maps.ControlPosition.TOP_LEFT] .pop (weatherKeyDiv); rainfallOverlayToggle = 0;
Wat nu?
Goed gedaan om het einde te bereiken! Als je nog vragen hebt, vraag het dan in de comments. In de volgende zelfstudie wordt de verbinding met de Flickr API bekeken, zodat u automatisch foto's van Flickr kunt pakken en ze op uw kaart kunt weergeven.
Beeldcredits
- Mercator-projectiekaart - Wikipedia
- Gall-Peters projectiekaart - Wikipedia