Pokouším se georeferencovat sadu obrázkových dlaždic stažených z webu Google Maps. Pouze na každém obrázku Jak lze vypočítat souřadnice skutečného světa v mřížce Google Maps a úroveň přiblížení?

Stránka na adrese http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection zobrazuje souřadnice a reference mřížky Google Maps pro dlaždice webového obchodníka.

Například střední dlaždice je x=49, y=30, z=6 a má rohové souřadnice 10644926.307106785, 626172.1357121654, 11271098.44281895, 1252344.27142432:

zde zadejte popis obrázku

Je možné vypočítat souřadnice rohu pouze na základě reference mřížky a úrovně přiblížení (49, 30, 6)?

Je to podobné jako Jak správně georeferencovat dlaždice webového mercatoru pomocí gdal? , ale potřebuji úplně programové řešení, aniž bych musel něco hledat online. (Nebo pokud potřebuji vyhledat hodnoty online, musí to být programové.)

Upravit: Tento snímek obrazovky ukazuje umístění ukázkové dlaždice (úroveň přiblížení 11, x = 1593, y = 933) . Jak bych georeferenci této dlaždice?

zde zadejte popis obrázku

Komentáře

  • Vypadá to jako skutečná dlaždice? Žádné okolí?
  • @FelixIP jo, vše, co vím, je reference mřížky a úroveň přiblížení každého jednotlivého JPG. Přidal jsem ‚ snímek obrazovky, abych to prokázal. PS Uvědomuji si, že je to trochu riskantní, ale někdy to musí být provedeno – plus je to ‚ zajímavé cvičení!
  • Myslím, že byste měli být schopni roh se srdíčkuje pouze pomocí úrovní přiblížení a odkazu na mřížku, pokud vím, referenční systém mřížky zůstává konstantní, takže by měl existovat způsob, jak to udělat. Jelikož úroveň přiblížení 0 má svět v 1 dlaždici a zvětšuje 1 v 4 atd., Mělo by být možné získat souřadnice.
  • @StephenLead se může pokusit rozdělit svět na 4 části v každém přiblížení ( iterace) a pomocí toho nějak získat souřadnice. Bude to ale ‚ být iterativní funkcí, rozumím však.
  • máte to povoleno? to znamená, umožňují to podmínky google maps?

Odpověď

Tato stránka http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection poskytuje algoritmy psané v pythonu pro výpočet hranic dlaždic v souřadnicích EPSG: 900913 a v zeměpisné šířce a délce pomocí základny WGS84.

Třída GlobalMercator v tomto skriptu http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection / globalmaptiles .py obsahuje dvě metody, TileBounds() a TileLatLonBounds(), jak toho dosáhnout.

Upravená verze skriptu pro zobrazení souřadnic hranic dlaždic:

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

Použití: tilebounds xTile yTile zoom.

Například výstup pro dlaždici x=49, y=30, z=6 je následující:

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

Dlaždici lze stáhnout pomocí adresy URL http://mt.google.com/vt?x=xTile&y=yTile&z=zoom, ale je to zakázán přímý přístup.

Software původně napsal Klokan Petr Přidal.

Doufám, že by to mohlo pomoci!

Komentáře

  • Vítejte na GIS Stack Exchange a děkuji za to. Můj požadavek prošel, protože ‚ m již na tomto projektu nepracuji, ale tato informace by se snad měla v budoucnu ukázat někomu jinému

Odpověď

Pouhým házením to v rámci diskuse o dlaždicích, dlaždicích v mezipaměti, georeferencích atd.

Schémata obkladů z čeho Vím, že nepoužívám georeferenční systém XY sám o sobě …

Například když načtete základní mapu ESRI do QGIS, vytvoří se taková struktura složky stache dlaždice:

zde zadejte popis obrázku

Při prohlížení obrázků nejvyšší úrovně máte požadoval dlaždice a jsou uloženy v těchto různých složkách.

Zde je obsah složky f / d:

sem zadejte popis obrázku

Všimněte si, že v souboru nejsou žádné georeferenční informace (světový soubor atd.)

Když přinesete tento soubor do MS například můžete s obrázkem manipulovat a znovu jej uložit:

zde zadejte popis obrázku

…takže při opětovném zobrazení mapy v QGIS – který vykresluje dlaždice – můžete vidět svoji „upravenou“ dlaždici:

zde zadejte popis obrázku

Takže myslím, že vše, co říkám, je, že pokud jste měli sadu dlaždic ze služby Google Earth, můžete teoreticky dlaždici znovu vytvořit. Struktura a jednoduše vložte dlaždice do těchto složek a nakreslily by QGIS …

Je to samotný software, který ví, kam kreslit dlaždice na základě schématu ukládání do mezipaměti a struktury složek … to se vrací do mých dnů, kdy jsem učil kurzy serveru ArcGIS Server.

Poté byste je mohli exportovat z QGIS s georeferenčními informacemi a použít jinde.

Ale znovu můžete také jednoduše načíst google mapy do QGIS a exportovat obrázek jako TIF se světovým souborem …

(Opět ne ve skutečnosti odpověď, jen nějaká diskuse …)

Komentáře

  • omlouvám se za pozdní odpověď. Abych byl upřímný, nemohu si ‚ ani vzpomenout, proč jsem se na to ptal, protože projekt je už dávno za námi;) Pamatuji si však, že jsem potřeboval znovu vytvořit cokoli, co voodoo dělá ví, jak umístit obrázky na základě struktury složek.

Odpovědět

Nedávno jste narazili na tento problém, můžete použít kód uvedený v wiki.openstreetmap.org

Zde je kód 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))); } 

Odpověď

Základní matematický přístup naleznete v mé odpovědi na související otázku zde: výpočet ohraničovacího rámečku ze známé středové souřadnice a zvětšení

Budete muset být schopni převést ze souřadnic dlaždice a pixelů v dlaždici na souřadnice pixelů, ale to je není příliš tvrdý.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *