Jeg prøver at georeference et sæt billedfliser, der er downloadet fra et Google Maps-sted. Baseret kun på hvert billede “s Google Maps-gitterreference og zoomniveau, hvordan kan jeg beregne de virkelige koordinater?

Siden på http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection viser koordinaterne og Google Maps-gitterreference for web-mercator-fliser.

For eksempel er centerflisen x=49, y=30, z=6 hjørnekoordinater 10644926.307106785, 626172.1357121654, 11271098.44281895, 1252344.27142432:

indtast billedbeskrivelse her

Er det muligt at beregne hjørnekoordinaterne udelukkende baseret på gitterreference og zoomniveau (49, 30, 6)?

Dette svarer til Hvordan georefererer man en web-mercator-flise korrekt ved hjælp af gdal? men jeg har brug for en fuldstændig programmatisk løsning uden at skulle slå noget op online. (Eller hvis jeg har brug for at slå værdier online op, skal det være programmatisk).

Rediger: dette skærmbillede viser placeringen af en prøveflise (zoomniveau 11, x = 1593, y = 933) . Hvordan ville jeg georeferere den flise?

indtast billedbeskrivelse her

Kommentarer

  • Kommer det som en sand flise? Ingen omgivelser?
  • @ FelixIP ja, alt hvad jeg ved er gitterreference og zoomniveau for hver enkelt JPG. Jeg ‘ har tilføjet et screenshot for at demonstrere dette. PS Jeg er klar over, at dette er lidt risikabelt, men nogle gange skal det gøres – plus det ‘ er en interessant øvelse!
  • Jeg synes, du skulle være i stand til at få hjørnet kordinerer ved kun at bruge zoomniveauer og gitterreference, så vidt jeg ved, forbliver gitterreferencesystemet konstant, så der skulle være en måde at gøre dette på. Da zoomniveau 0 har verden i 1 flise og zoom 1 på 4 og så videre, bør det være muligt at få koordinaterne.
  • @StephenLead måske prøve at opdele verden i 4 dele i hver zoom ( iteration) og få koordinaterne ved hjælp af det på en eller anden måde. Det ‘ skal dog være en iterativ funktion, men efter min forståelse.
  • har du lov til at gøre dette? det vil sige, tillader google maps udtryk dette?

Svar

Denne side http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection giver algoritmer, der er skrevet i python, til at beregne fliseregioner i EPSG: 900913-koordinater og i latutude / længdegrad ved hjælp af WGS84-henvisning.

Klassen GlobalMercator i dette script http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection / globalmaptiles .py indeholder to metoder, TileBounds() og TileLatLonBounds() for at gøre dette.

En ændret version af scriptet, der viser fliseregionskoordinater:

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

Brug: tilebounds xTile yTile zoom.

For eksempel output for flisen x=49, y=30, z=6 er som følger:

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

En flise kan downloades med url http://mt.google.com/vt?x=xTile&y=yTile&z=zoom, men dette er forbudt at få adgang til det direkte.

Softwaren blev oprindeligt skrevet af Klokan Petr Přidal.

Jeg håber, dette kunne hjælpe!

Kommentarer

  • Velkommen til GIS Stack Exchange, og mange tak for dette. Mit krav er bestået, da jeg ‘ ikke længere arbejder på dette projekt, men disse oplysninger skal forhåbentlig vise sig nyttige for en anden i fremtiden

Svar

Kaster bare dette ind som en del af diskussionen om fliser, cachelagrede fliser, georeferering osv.

Fliseskemaer fra hvad Jeg ved, at de ikke bruger et XY-georeferencingsystem i sig selv …

For eksempel, når du indlæser ESRI-basekortet i QGIS, opretter det en flise-stache-mappestruktur som denne:

indtast billedebeskrivelse her

Når du ser billeder på øverste niveau, har du anmodede om fliserne, og de er gemt i disse forskellige mapper.

Her er indholdet af f / d-mappen:

indtast billedbeskrivelse her

Bemærk ingen georeferencerende oplysninger i filen (verdensfil osv.)

Når du bringer denne fil ind i MS maling, for eksempel kan du manipulere billedet og gemme det igen:

indtast billedbeskrivelse her

…så når du ser kortet igen i QGIS – som gengiver fliserne – kan du se din “redigerede” flise:

indtast billedbeskrivelse her

Så jeg antager, at alt hvad jeg siger er, hvis du havde et sæt fliser fra google earth, kunne du i teorien genskabe flisen struktur og simpelthen sætte fliserne i disse mapper, og de ville tegne i QGIS …

Det er selve softwaren, der ved, hvor de skal tegne fliserne baseret på caching-skemaet og mappestrukturen … dette går igen tilbage til mine dage med at undervise i ArcGIS Server-kurser.

Du kan derefter eksportere dem fra QGIS med georefererende oplysninger og bruge dem andre steder.

Men så igen, du kan også bare indlæse google maps i QGIS og eksportere billedet som en TIF med en verdensfil …

(Igen, ikke rigtig et svar, bare noget diskussion …)

Kommentarer

  • undskyld for det sene svar. For at være ærlig kan jeg ‘ ikke engang huske, hvorfor jeg spurgte dette, da projektet er forbi;) Jeg kan dog huske, at jeg havde brug for at genskabe den voodoo, som softwaren laver, det ved, hvordan man placerer billeder baseret på mappestrukturen

Svar

Opstået dette problem for nylig, kan du bruge koden i wiki.openstreetmap.org

Her er Java-koden:

 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))); } 

Svar

For den underliggende matematiske tilgang, se mit svar på et relateret spørgsmål her: beregning af afgrænsningsfelt fra kendt centerkoordinat og zoom

Du bliver nødt til at være i stand til at konvertere fra flisekoordinater og pixels inden for en flise til pixelkoordinater, men det er ikke for hårdt.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *