Jessaie de géoréférencer un ensemble de vignettes dimages téléchargées à partir dun site Google Maps. Basé uniquement sur chaque image « s Google Maps grille de référence et le niveau de zoom, comment puis-je calculer les coordonnées du monde réel?

La page à http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection affiche les coordonnées et la référence de la grille Google Maps pour les vignettes Web Mercator.

Par exemple, la vignette centrale est x=49, y=30, z=6 et a le coordonnées dangle 10644926.307106785, 626172.1357121654, 11271098.44281895, 1252344.27142432:

entrez la description de limage ici

Est-il possible de calculer les coordonnées des coins en se basant uniquement sur la référence de la grille et le niveau de zoom (49, 30, 6)?

Ceci est similaire à Comment géoréférencer correctement une tuile Web Mercator en utilisant gdal? mais jai besoin dune solution entièrement programmatique, sans avoir besoin de chercher quoi que ce soit en ligne. (Ou, si jai besoin de rechercher des valeurs en ligne, cela doit être programmatique).

Modifier: cette capture décran montre lemplacement dun exemple de vignette (niveau de zoom 11, x = 1593, y = 933) . Comment géoréférencer cette tuile?

entrez la description de limage ici

Commentaires

  • Sagit-il dune vraie tuile? Aucun environnement?
  • @FelixIP ouais tout ce que je sais, cest la référence de la grille et le niveau de zoom de chaque JPG individuel. Jai ‘ ajouté une capture décran pour le démontrer. PS Je me rends compte que cest un peu douteux, mais parfois il faut le faire – en plus, ‘ est un exercice intéressant!
  • Je pense que vous devriez pouvoir le faire les coordonnées dangle en utilisant uniquement les niveaux de zoom et la référence de grille, pour autant que je sache, le système de référence de grille reste constant, il devrait donc y avoir un moyen de le faire. Étant donné que le niveau de zoom 0 a le monde en 1 tuile et le zoom 1 en 4 et ainsi de suite, il devrait être possible dobtenir les coordonnées.
  • @StephenLead peut peut-être essayer de diviser le monde en 4 parties dans chaque zoom ( itération) et obtenez les coordonnées en utilisant cela dune manière ou dune autre. Cela ‘ devra être une fonction itérative si je comprends bien.
  • êtes-vous autorisé à le faire? autrement dit, les termes de Google Maps le permettent-ils?

Réponse

Cette page http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection fournit des algorithmes, écrits en python, pour calculer les limites de tuiles en coordonnées EPSG: 900913 et en latutude / longitude en utilisant la donnée WGS84.

La classe GlobalMercator dans ce script http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection / globalmaptiles .py contient deux méthodes, TileBounds() et TileLatLonBounds() pour ce faire.

Une version modifiée du script pour afficher les coordonnées des limites des tuiles:

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

Utilisation: tilebounds xTile yTile zoom.

Par exemple, la sortie de la vignette x=49, y=30, z=6 est la suivante:

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

Une tuile peut être téléchargée avec lurl http://mt.google.com/vt?x=xTile&y=yTile&z=zoom, mais cest interdit dy accéder directement.

Le logiciel a été initialement écrit par Klokan Petr Přidal.

Jespère que cela pourra vous aider!

Commentaires

  • Bienvenue dans GIS Stack Exchange, et merci beaucoup pour cela. Mon exigence est passée car je ‘ ne travaille plus sur ce projet, mais nous espérons que cette information devrait savérer utile à quelquun dautre à lavenir

Réponse

Il suffit de lancer ceci dans le cadre de la discussion sur les tuiles, les tuiles mises en cache, le géoréférencement, etc.

Schémas de tuilage à partir de quoi Je sais que vous nutilisez pas de système de géoréférencement XY en soi …

Par exemple, lorsque vous chargez le fond de carte ESRI dans QGIS, cela créera une structure de dossier de stache de tuiles comme celle-ci:

entrez la description de limage ici

Lors de la visualisation des images de premier niveau, vous avez a demandé les tuiles, et elles sont stockées dans ces différents dossiers.

Voici le contenu du dossier f / d:

entrez la description de limage ici

Ne notez aucune information de géoréférencement dans le fichier (fichier mondial, etc.)

Quand vous apportez ce fichier dans MS peindre, par exemple, vous pouvez manipuler limage et la réenregistrer:

entrez la description de limage ici

…Ainsi, lorsque vous visualisez à nouveau la carte dans QGIS – qui rend les tuiles – vous pouvez voir votre tuile « modifiée »:

entrez la description de limage ici

Donc, je suppose que tout ce que je dis, cest que si vous aviez un ensemble de tuiles de Google Earth, vous pourriez en théorie recréer la tuile structure et placez simplement les tuiles dans ces dossiers, et ils dessineraient dans QGIS …

Cest le logiciel lui-même qui sait où dessiner les tuiles en fonction du schéma de mise en cache et de la structure des dossiers … cela remonte à nouveau à mes jours denseignement des cours ArcGIS Server.

Vous pouvez ensuite les exporter depuis QGIS avec des informations de géoréférencement et les utiliser ailleurs.

Mais là encore, vous pouvez aussi simplement charger des cartes Google dans QGIS et exporter limage sous forme de TIF avec un fichier mondial …

(Encore une fois, pas vraiment une réponse, juste quelques discussions …)

Commentaires

  • désolé pour la réponse tardive. Pour être honnête, je ne peux ‘ me rappeler pourquoi je posais cette question, car le projet est terminé depuis longtemps;) Je me souviens cependant que javais besoin de recréer tout ce que le logiciel fait quand il sait comment placer des images en fonction de la structure des dossiers

Answer

Rencontré ce problème récemment, vous pouvez utiliser le code fourni dans le wiki.openstreetmap.org

Voici le code 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éponse

Pour lapproche mathématique sous-jacente, veuillez consulter ma réponse à une question connexe ici: calcul de la zone de délimitation à partir des coordonnées centrales et du zoom connus

Vous devrez être en mesure de convertir les coordonnées et les pixels dune mosaïque en coordonnées de pixels, mais » s pas trop difficile.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *