Încerc să georeferenționați un set de plăci de imagine descărcate de pe un site Google Maps. Bazat numai pe fiecare imagine Referința la grila Google Maps și nivelul de zoom, cum pot calcula coordonatele din lumea reală?
Pagina de la http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection afișează coordonatele și referința grilei Google Maps pentru dale web mercator.
De exemplu, dala centrală este x=49, y=30, z=6
și are coordonate de colț 10644926.307106785, 626172.1357121654, 11271098.44281895, 1252344.27142432
:
Este posibil să calculați coordonatele de colț numai pe baza referinței grilei și a nivelului de zoom (49, 30, 6)?
Acest lucru este similar cu Cum să georeferenționați corect o placă web mercator folosind gdal? , dar am nevoie de o soluție complet programatică, fără a fi nevoie să caut ceva online. (Sau, dacă trebuie să caut valori online, trebuie să fie programatic).
Editați: această captură de ecran arată locația unei piese eșantion (nivel de zoom 11, x = 1593, y = 933) . Cum aș georeferenta acea țiglă?
Comentarii
- Vine ca o adevărată țiglă? Nu aveți în jur?
- @FelixIP, da, tot ce știu este referința la grilă și nivelul de zoom al fiecărui JPG individual. Am ‘ am adăugat o captură de ecran pentru a demonstra acest lucru. PS Îmi dau seama că acest lucru este ușor obosit, dar uneori trebuie făcut – plus că ‘ este un exercițiu interesant!
- Cred că ar trebui să poți obține coordonatele de colț folosind doar nivelurile de zoom și referința grilei, din câte știu, sistemul de referință a grilei rămâne constant, deci ar trebui să existe o modalitate de a face acest lucru. Deoarece nivelul de zoom 0 are lumea în 1 țiglă și zoom 1 în 4 și așa mai departe, ar trebui să fie posibil să obțineți coordonatele.
- @StephenLead poate încercați să împărțiți lumea în 4 părți în fiecare zoom ( iterație) și obțineți coordonatele folosind-o cumva. ‘ va trebui să fie o funcție iterativă, însă, din înțelegerea mea.
- aveți voie să faceți acest lucru? adică, termenii Google Maps permit acest lucru?
Răspunde
Această pagină http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection furnizează algoritmi, scrisați în python, pentru a calcula limitele țiglelor în coordonatele EPSG: 900913 și în latutudă / longitudine folosind datul WGS84.
Clasa GlobalMercator
din acest script http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection / globalmaptiles .py conține două metode, TileBounds()
și TileLatLonBounds()
pentru a face acest lucru.
O versiune modificată a scriptului pentru a afișa coordonatele limitelor țiglelor:
#!/usr/bin/env python ############################################################################### # $Id$ # # Project: GDAL2Tiles, Google Summer of Code 2007 & 2008 # Global Map Tiles Classes # Purpose: Convert a raster into TMS tiles, create KML SuperOverlay EPSG:4326, # generate a simple HTML viewers based on Google Maps and OpenLayers # Author: Klokan Petr Pridal, klokan at klokan dot cz # Web: http://www.klokan.cz/projects/gdal2tiles/ # ############################################################################### # Copyright (c) 2008 Klokan Petr Pridal. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### """ tilebounds.py Adapted from: http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/globalmaptiles.py Global Map Tiles as defined in Tile Map Service (TMS) Profiles ============================================================== Functions necessary for generation of global tiles used on the web. It contains classes implementing coordinate conversions for: - GlobalMercator (based on EPSG:900913 = EPSG:3785) for Google Maps, Yahoo Maps, Microsoft Maps compatible tiles - GlobalGeodetic (based on EPSG:4326) for OpenLayers Base Map and Google Earth compatible tiles More info at: http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification http://wiki.osgeo.org/wiki/WMS_Tiling_Client_Recommendation http://msdn.microsoft.com/en-us/library/bb259689.aspx http://code.google.com/apis/maps/documentation/overlays.html#Google_Maps_Coordinates Created by Klokan Petr Pridal on 2008-07-03. Google Summer of Code 2008, project GDAL2Tiles for OSGEO. In case you use this class in your product, translate it to another language or find it usefull for your project please let me know. My email: klokan at klokan dot cz. I would like to know where it was used. Class is available under the open-source GDAL license (www.gdal.org). """ import math class GlobalMercatorLight(object): def __init__(self, tileSize=256): "Initialize the TMS Global Mercator pyramid" self.tileSize = tileSize self.initialResolution = 2 * math.pi * 6378137 / self.tileSize # 156543.03392804062 for tileSize 256 pixels self.originShift = 2 * math.pi * 6378137 / 2.0 # 20037508.342789244 def MetersToLatLon(self, mx, my ): "Converts XY point from Spherical Mercator EPSG:900913 to lat/lon in WGS84 Datum" lon = (mx / self.originShift) * 180.0 lat = (my / self.originShift) * 180.0 lat = 180 / math.pi * (2 * math.atan( math.exp( lat * math.pi / 180.0)) - math.pi / 2.0) return lat, lon def PixelsToMeters(self, px, py, zoom): "Converts pixel coordinates in given zoom level of pyramid to EPSG:900913" res = self.Resolution( zoom ) mx = px * res - self.originShift my = py * res - self.originShift return mx, my def TileBounds(self, tx, ty, zoom): "Returns bounds of the given tile in EPSG:900913 coordinates" minx, miny = self.PixelsToMeters( tx*self.tileSize, ty*self.tileSize, zoom ) maxx, maxy = self.PixelsToMeters( (tx+1)*self.tileSize, (ty+1)*self.tileSize, zoom ) return ( minx, miny, maxx, maxy ) def TileLatLonBounds(self, tx, ty, zoom ): "Returns bounds of the given tile in latutude/longitude using WGS84 datum" bounds = self.TileBounds( tx, ty, zoom) minLat, minLon = self.MetersToLatLon(bounds[0], bounds[1]) maxLat, maxLon = self.MetersToLatLon(bounds[2], bounds[3]) return ( minLat, minLon, maxLat, maxLon ) def Resolution(self, zoom ): "Resolution (meters/pixel) for given zoom level (measured at Equator)" # return (2 * math.pi * 6378137) / (self.tileSize * 2**zoom) return self.initialResolution / (2**zoom) #--------------------- if __name__ == "__main__": import sys, os def Usage(s = ""): print "Usage: tilebounds.py tx ty zoomlevel" print sys.exit(1) profile = "mercator" zoomlevel = None tx, ty = None, None argv = sys.argv i = 1 while i < len(argv): arg = argv[i] if tx is None: tx = float(argv[i]) elif ty is None: ty = float(argv[i]) elif zoomlevel is None: zoomlevel = int(argv[i]) else: Usage("ERROR: Too many parameters") i = i + 1 if profile != "mercator": Usage("ERROR: Sorry, given profile is not implemented yet.") if zoomlevel == None or tx == None or ty == None: Usage("ERROR: Specify at least "lat", "lon" and "zoomlevel".") tz = zoomlevel mercator = GlobalMercatorLight() minx, miny, maxx, maxy = mercator.TileBounds( tx, ty, tz ) print "Bounds of the given tile in EPSG:900913 coordinates: " print " upper-left corner: " print (minx, miny) print " bottom-right corner: " print (maxx, maxy) print minLat, minLon, maxLat, maxLon = mercator.TileLatLonBounds( tx, ty, tz ) print "Bounds of the given tile in latitude/longitude using WGS84 datum: " print " upper-left corner: " print (minLat, minLon) print " bottom-right corner: " print (maxLat, maxLon) print
Utilizare: tilebounds xTile yTile zoom
.
De exemplu, ieșirea pentru țiglă x=49
, y=30
, z=6
este după cum urmează:
$./tilebounds.py 49 30 6 Bounds of the given tile in EPSG:900913 coordinates: upper-left corner: (10644926.307106785, -1252344.271424327) bottom-right corner: (11271098.44281895, -626172.1357121654) Bounds of the given tile in latitude/longitude using WGS84 datum: upper-left corner: (-11.178401873711772, 95.625) bottom-right corner: (-5.61598581915534, 101.25000000000001)
O țiglă poate fi descărcată cu adresa URL http://mt.google.com/vt?x=xTile&y=yTile&z=zoom
, dar aceasta este interzis accesul direct.
Software-ul a fost scris inițial de Klokan Petr Přidal.
Sper că acest lucru vă poate ajuta!
Comentarii
- Bine ați venit la GIS Stack Exchange și multe mulțumiri pentru acest lucru. Cerința mea a trecut, deoarece ‘ nu mai lucrez la acest proiect, dar această informație ar trebui să se dovedească utilă pentru altcineva în viitor
Răspuns
Aruncând acest lucru doar ca parte a discuției despre dale, dale în cache, georeferențierea etc.
Scheme de dale din ceea ce Știu că nu utilizați un sistem de georeferențiere XY în sine …
De exemplu, atunci când încărcați harta de bază ESRI în QGIS, se va crea o structură de folder de tip stache ca:
Când vizualizați imaginile de nivel superior, aveți a solicitat plăcile și acestea sunt stocate în acele diferite foldere.
Aici este conținutul folderului f / d:
Observați că nu există informații de georeferențiere în fișier (fișier mondial etc.)
Când aduceți acest fișier în MS vopsea, de exemplu, puteți manipula imaginea și salva din nou:
…deci, când vizualizați harta din nou în QGIS – care redă plăcile – puteți vedea plăcuța dvs. „editată”:
Deci, cred că tot ce spun este că dacă ați avea un set de plăci de pe Google Earth, în teorie ați putea să recreați plăcuța structura și pur și simplu pune dale în acele foldere, iar acestea ar desena în QGIS …
Este software-ul în sine care știe unde să deseneze dale pe baza schemei de cache și a structurii folderelor … acest lucru se întoarce din nou la zilele mele de predare a cursurilor ArcGIS Server.
Puteți apoi să le exportați din QGIS cu informații de georeferențiere și să le utilizați în altă parte.
Dar din nou, puteți încărca google maps în QGIS și exporta imaginea ca TIF cu un fișier mondial …
(Din nou, nu chiar un răspuns, doar unele discuții …)
Comentarii
- îmi pare rău pentru răspunsul târziu. Pentru a fi sincer, nu pot ‘ să-mi amintesc nici măcar de ce am întrebat acest lucru, deoarece proiectul s-a încheiat de mult;) îmi amintesc totuși că trebuia să recreez orice voodoo face software-ul atunci când știe cum să plaseze imagini pe baza structurii dosarelor
Răspuns
Am întâlnit această problemă recent, puteți utiliza codul furnizat în wiki.openstreetmap.org
Iată codul Java:
class BoundingBox { double north; double south; double east; double west; } BoundingBox tile2boundingBox(final int x, final int y, final int zoom) { BoundingBox bb = new BoundingBox(); bb.north = tile2lat(y, zoom); bb.south = tile2lat(y + 1, zoom); bb.west = tile2lon(x, zoom); bb.east = tile2lon(x + 1, zoom); return bb; } static double tile2lon(int x, int z) { return x / Math.pow(2.0, z) * 360.0 - 180; } static double tile2lat(int y, int z) { double n = Math.PI - (2.0 * Math.PI * y) / Math.pow(2.0, z); return Math.toDegrees(Math.atan(Math.sinh(n))); }
Răspuns
Pentru abordarea matematică de bază, vă rugăm să consultați răspunsul meu la o întrebare conexă aici: calcularea casetei de delimitare de la coordonatele centrale cunoscute și zoom
Va trebui să puteți converti din coordonatele și pixelii din cadrul unei țigle în coordonatele pixelilor, dar asta este„ s nu prea greu.