Estoy tratando de georreferenciar un conjunto de mosaicos de imágenes descargados de un sitio de Google Maps. Basado solo en cada imagen «s la referencia de cuadrícula de Google Maps y el nivel de zoom, ¿cómo puedo calcular las coordenadas del mundo real?

La página en http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection muestra las coordenadas y la referencia de cuadrícula de Google Maps para mosaicos de mercator web.

Por ejemplo, el mosaico central es x=49, y=30, z=6 y tiene el coordenadas de esquina 10644926.307106785, 626172.1357121654, 11271098.44281895, 1252344.27142432:

ingrese la descripción de la imagen aquí

¿Es posible calcular las coordenadas de las esquinas basándose únicamente en la referencia de la cuadrícula y el nivel de zoom (49, 30, 6)?

Esto es similar a ¿Cómo georreferenciar un mosaico de mercator web correctamente usando gdal? pero necesito una solución completamente programática, sin necesidad de buscar nada en línea. (O, si necesito buscar valores en línea, debe ser programático).

Editar: esta captura de pantalla muestra la ubicación de un mosaico de muestra (nivel de zoom 11, x = 1593, y = 933) . ¿Cómo georreferenciaría ese mosaico?

ingrese la descripción de la imagen aquí

Comentarios

  • ¿Viene como un mosaico verdadero? ¿Sin alrededores?
  • @FelixIP sí, todo lo que sé es la referencia de cuadrícula y el nivel de zoom de cada JPG individual. ‘ he añadido una captura de pantalla para demostrar esto. PD: Me doy cuenta de que esto es un poco dudoso, pero a veces hay que hacerlo; además, ‘ es un ejercicio interesante.
  • Creo que debería poder conseguir la esquina se coordina usando solo los niveles de zoom y la referencia de la cuadrícula, hasta donde yo sé, el sistema de referencia de la cuadrícula permanece constante, por lo que debería haber una manera de hacer esto. Dado que el nivel de zoom 0 tiene el mundo en 1 mosaico y el zoom 1 en 4 y así sucesivamente, debería ser posible obtener las coordenadas.
  • @StephenLead tal vez intente dividir el mundo en 4 partes en cada zoom ( iteración) y obtener las coordenadas usando eso de alguna manera. No obstante, ‘ tendrá que ser una función iterativa, según tengo entendido.
  • ¿Tiene permiso para hacer esto? es decir, ¿los términos de Google Maps permiten esto?

Respuesta

Esta página http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection proporciona algoritmos, escritos en python, para calcular los límites de los mosaicos en coordenadas EPSG: 900913 y en latitud / longitud utilizando el dato WGS84.

La clase GlobalMercator en este script http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection / globalmaptiles .py contiene dos métodos, TileBounds() y TileLatLonBounds() para hacer esto.

Una versión modificada del script para mostrar las coordenadas de los límites del mosaico:

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

Uso: tilebounds xTile yTile zoom.

Por ejemplo, la salida del mosaico x=49, y=30, z=6 es el siguiente:

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

Se puede descargar un mosaico con la url http://mt.google.com/vt?x=xTile&y=yTile&z=zoom, pero esto es Prohibido acceder a él directamente.

El software fue escrito originalmente por Klokan Petr Přidal.

¡Espero que esto pueda ayudar!

Comentarios

  • Bienvenido a GIS Stack Exchange y muchas gracias por esto. Mi requisito ha pasado porque ‘ ya no estoy trabajando en este proyecto, pero esta información debería resultar útil para otra persona en el futuro

Respuesta

Simplemente lanzando esto como parte de la discusión sobre mosaicos, mosaicos almacenados en caché, georreferenciación, etc.

Esquemas de mosaico de qué Sé que no use un sistema de georreferenciación XY per se …

Por ejemplo, cuando carga el mapa base de ESRI en QGIS, se creará una estructura de carpetas de teselas como esta:

ingrese la descripción de la imagen aquí

Al ver las imágenes de nivel superior, tiene solicitó los mosaicos y se almacenan en esas carpetas.

Aquí está el contenido de la carpeta f / d:

ingrese la descripción de la imagen aquí

No observe información de georreferenciación en el archivo (archivo mundial, etc.)

Cuando traes este archivo a MS paint, por ejemplo, puede manipular la imagen y volver a guardarla:

ingrese la descripción de la imagen aquí

…así que cuando veas el mapa nuevamente en QGIS, que está renderizando los mosaicos, puedes ver tu mosaico «editado»:

ingrese la descripción de la imagen aquí

Supongo que todo lo que digo es que si tuviera un conjunto de mosaicos de Google Earth, en teoría, podría volver a crear el mosaico estructura y simplemente coloque los mosaicos en esas carpetas, y dibujarán en QGIS …

Es el propio software el que sabe dónde dibujar los mosaicos en función del esquema de almacenamiento en caché y la estructura de carpetas … esto de nuevo se remonta a mis días de enseñar cursos de ArcGIS Server.

A continuación, puede exportarlos desde QGIS con información de georreferenciación y utilizarlos en otro lugar.

Pero, de nuevo, también puede cargar mapas de Google en QGIS y exportar la imagen como un TIF con un archivo mundial …

(De nuevo, no es realmente una respuesta, solo alguna discusión …)

Comentarios

  • perdón por la respuesta tardía. Para ser honesto, no puedo ‘ ni siquiera recordar por qué estaba preguntando esto, ya que el proyecto ha terminado;) Sin embargo, recuerdo que necesitaba recrear cualquier vudú que el software esté haciendo sabe cómo colocar imágenes según la estructura de la carpeta

Responder

Encontré este problema recientemente, puede usar el código proporcionado en el wiki.openstreetmap.org

Aquí está el código 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))); } 

Respuesta

Para el enfoque matemático subyacente, consulte mi respuesta a una pregunta relacionada aquí: calculando el cuadro delimitador a partir de la coordenada central conocida y el zoom

Deberá poder convertir de coordenadas de mosaico y píxeles dentro de un mosaico a coordenadas de píxeles, pero eso» s no demasiado difícil.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *