Sto cercando di georeferenziare un insieme di riquadri immagine scaricati da un sito di Google Maps. Basato solo su ciascuna immagine “di riferimento alla griglia e livello di zoom di Google Maps, come posso calcolare le coordinate del mondo reale?

La pagina in http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection mostra le coordinate e la griglia di riferimento di Google Maps per i riquadri web mercator.

Ad esempio, il riquadro centrale è x=49, y=30, z=6 e ha il coordinate dangolo 10644926.307106785, 626172.1357121654, 11271098.44281895, 1252344.27142432:

inserisci qui la descrizione dellimmagine

È possibile calcolare le coordinate degli angoli basandosi esclusivamente sul riferimento della griglia e sul livello di zoom (49, 30, 6)?

Questo è simile a Come georeferenziare correttamente un riquadro web mercator utilizzando gdal? ma ho bisogno di una soluzione completamente programmatica, senza bisogno di cercare nulla online. (Oppure, se ho bisogno di cercare valori online, deve essere programmatico).

Modifica: questo screenshot mostra la posizione di un riquadro di esempio (livello di zoom 11, x = 1593, y = 933) . Come faccio a georeferenziare quel riquadro?

inserisci qui la descrizione dellimmagine

Commenti

  • Si presenta come una vera tessera? Nessun ambiente?
  • @FelixIP sì, tutto quello che so è il riferimento alla griglia e il livello di zoom di ogni singolo JPG. ‘ ho aggiunto uno screenshot per dimostrarlo. PS Mi rendo conto che questo è un po rischioso, ma a volte deve essere fatto – in più ‘ è un esercizio interessante!
  • Penso che dovresti essere in grado di ottenere langolo si coordina usando solo i livelli di zoom e il riferimento della griglia, per quanto ne so, il sistema di riferimento della griglia rimane costante, quindi dovrebbe esserci un modo per farlo. Poiché il livello di zoom 0 ha il mondo in 1 riquadro e lo zoom 1 in 4 e così via, dovrebbe essere possibile ottenere le coordinate.
  • @StephenLead potrebbe provare a dividere il mondo in 4 parti in ogni zoom ( iterazione) e ottenere le coordinate usando in qualche modo. ‘ dovrà essere una funzione iterativa anche se per quanto ne so.
  • sei autorizzato a farlo? ovvero, i termini di Google Maps lo consentono?

Rispondi

Questa pagina http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection fornisce algoritmi, scritti in Python, per calcolare i limiti delle tessere in EPSG: coordinate 900913 e in latutude / longitudine utilizzando il dato WGS84.

La classe GlobalMercator in questo script http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection / globalmaptiles .py contiene due metodi, TileBounds() e TileLatLonBounds() per farlo.

Una versione modificata dello script per mostrare le coordinate dei limiti delle tessere:

 #!/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  

Utilizzo: tilebounds xTile yTile zoom.

Ad esempio, loutput per il riquadro x=49, y=30, z=6 è il seguente:

$./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) 

Un riquadro può essere scaricato con lURL http://mt.google.com/vt?x=xTile&y=yTile&z=zoom, ma questo è vietato accedervi direttamente.

Il software è stato originariamente scritto da Klokan Petr Přidal.

Spero che questo possa aiutare!

Commenti

  • Benvenuto in GIS Stack Exchange e molte grazie per questo. Il mio requisito è stato superato poiché ‘ non lavoro più su questo progetto, ma si spera che queste informazioni si rivelino utili per qualcun altro in futuro

Risposta

Inserendolo come parte della discussione su tessere, tessere memorizzate nella cache, riferimenti geografici, ecc.

Schemi di piastrellatura da cosa So di non usare un sistema di georeferenziazione XY di per sé …

Ad esempio, quando carichi la mappa di base ESRI in QGIS, creerà una struttura di cartelle di stache di tessere come questa:

inserisci qui la descrizione dellimmagine

Quando visualizzi le immagini di primo livello, devi ha richiesto le tessere e vengono memorizzate in quelle varie cartelle.

Ecco il contenuto della cartella f / d:

inserisci qui la descrizione dellimmagine

Notare che non ci sono informazioni di georeferenziazione nel file (file world, ecc.)

Quando porti questo file in MS paint, ad esempio, puoi manipolare limmagine e salvarla nuovamente:

inserisci qui la descrizione dellimmagine

…quindi quando visualizzi di nuovo la mappa in QGIS, che sta visualizzando le tessere, puoi vedere la tua tessera “modificata”:

inserisci qui la descrizione dellimmagine

Quindi immagino che tutto quello che sto dicendo è che se avessi un set di tessere da Google Earth, potresti in teoria ricreare la tessera struttura e mettere semplicemente le tessere in quelle cartelle, e disegnerebbero in QGIS …

È il software stesso che sa dove disegnare le tessere in base allo schema di cache e alla struttura delle cartelle … anche questo risale ai miei giorni in cui insegnavo ai corsi di ArcGIS Server.

Potresti quindi esportarli da QGIS con informazioni di georeferenziazione e usarli altrove.

Ma poi di nuovo, potresti anche caricare google maps in QGIS ed esportare limmagine come TIF con un file world …

(Anche in questo caso, non proprio una risposta, solo qualche discussione …)

Commenti

  • scusa per la risposta in ritardo. Ad essere onesto, non posso ‘ nemmeno ricordare perché lo stavo chiedendo, dato che il progetto è finito da tempo;) Ricordo però che dovevo ricreare qualunque cosa voodoo il software stesse facendo quando sa come posizionare le immagini in base alla struttura delle cartelle

Risposta

Hai riscontrato questo problema di recente, puoi usare il codice fornito nel wiki.openstreetmap.org

Ecco il codice 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))); } 

Risposta

Per lapproccio matematico sottostante, vedere la mia risposta a una domanda correlata qui: calcolo del riquadro di delimitazione dalla coordinata centrale nota e dallo zoom

Dovrai essere in grado di convertire da coordinate e pixel allinterno di un riquadro in coordinate pixel, ma” s non troppo difficile.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *