Megpróbálok georeferálni egy Google Maps webhelyről letöltött képcsempe készletet. Csak az egyes képek alapján “Google Maps rács referencia és nagyítási szint, hogyan számíthatom ki a valós koordinátákat?
Az oldal a http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection megmutatja a koordinátákat és a Google Maps rácshivatkozását a webes Mercator-csempékhez.
Például a középső csempe x=49, y=30, z=6
, és a sarokkoordináták 10644926.307106785, 626172.1357121654, 11271098.44281895, 1252344.27142432
:
Lehetséges-e a sarokkoordináták kiszámítása kizárólag a rács referencia és nagyítási szint (49, 30, 6) alapján?
Ez hasonló a Hogyan lehet egy webes mercator csempét helyesen georeferálni a gdal használatával? , de nekem egy teljesen programozási megoldásra van szükségem, anélkül, hogy bármi utánajárnék az interneten. (Vagy ha valóban online kell megkeresnem az értékeket, akkor programozottnak kell lennie.
Szerkesztés: ez a képernyőkép egy minta csempe helyét mutatja (11. nagyítási szint, x = 1593, y = 933) . Hogyan georeferálnám azt a csempét?
Megjegyzések
- Igazi csempeként jelenik meg? Nincs környező?
- @FelixIP igen, csak annyit tudok, hogy az egyes JPG-k rács referenciája és nagyítási szintje.
képernyőképet adtam ennek bemutatására. PS Tudomásul veszem, hogy ez kissé furcsa, de néha meg kell csinálni – ráadásul ‘ egy érdekes gyakorlat!
Válasz
Ez az oldal http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection pythonban írt algoritmusok biztosítják a csempék határainak számítását az EPSG: 900913 koordinátákban és a szélességi / hosszúsági fokokban a WGS84 nullapont segítségével.
A GlobalMercator
osztály ebben a szkriptben http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection / globalmaptiles A .py kétféle módszert tartalmaz: TileBounds()
és TileLatLonBounds()
.
A szkript módosított változata a csempék határkoordinátáinak megjelenítésére:
#!/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
Használat: tilebounds xTile yTile zoom
.
Például a x=49
, y=30
, z=6
a következő:
$./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)
Egy csempe letölthető az URL-lel http://mt.google.com/vt?x=xTile&y=yTile&z=zoom
, de ez közvetlenül hozzáférni tilos.
A szoftvert eredetileg Klokan Petr Přidal írta.
Remélem, hogy ez segíthet!
Kommentárok
- Üdvözöljük a GIS Stack Exchange szolgáltatásban, és nagyon köszönöm ezt. A követelményem letelt, mivel ‘ már nem dolgozom ezen a projekten, de ez az információ remélhetőleg hasznos lehet másnak a jövőben.
Válasz
Csak dobja be ezt a csempékről, a gyorsítótárazott csempékről, a georeferenciákról stb. folytatott beszélgetés részeként.
Csempézési sémák Tudom, hogy önmagában ne használjon XY georeferáló rendszert …
Például, amikor az ESRI alaptérképet betölti a QGIS-be, egy ilyen csempés stache mappaszerkezetet hoz létre:
A legfelső szintű képek megtekintésekor kérte a csempéket, és ezek a különféle mappákban vannak tárolva.
Itt találhatók az f / d mappa tartalma:
Ne vegye figyelembe, hogy a fájlban (világfájl stb.) nincsenek georeferencia információk.
Amikor ezt a fájlt beviszed az MS-be például a paint használatával manipulálhatja a képet és újból elmentheti:
…így amikor újra megnézi a térképet a QGIS-ben – amely a lapokat rendereli – láthatja a “szerkesztett” csempét:
Tehát azt hiszem, csak annyit mondok, hogy ha a Google Earth-ből egy sor burkolat van, akkor elméletileg újra létrehozhatja a csempét struktúrázza, és egyszerűen helyezze be a csempéket ezekbe a mappákba, és azok a QGIS-be rajzolódnának. ez megint az ArcGIS Server tanfolyamok oktatása napjaimra nyúlik vissza.
Ezután exportálhatja őket a QGIS-ből georeferencia információkkal, és máshol is felhasználhatja őket.
De még egyszer, egyszerűen betöltheti a Google Maps-et a QGIS-be, és TIF-formátumban exportálja a képet egy világfájllal …
(Megint nem igazán válasz, csak némi vita …)
Megjegyzések
- sajnálom a késői választ. Hogy őszinte legyek, még ‘ nem is emlékszem, miért kérdeztem ezt, mivel a projektnek már régen vége;) Emlékszem azonban, hogy újból létre kellett hoznom a szoftvert, amikor a szoftver tudja, hogyan kell elhelyezni a képeket a mappastruktúra alapján
Válasz
Nemrégiben találkozott ezzel a problémával, használhatja a wiki.openstreetmap.org
kódja: Itt van a Java kód:
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))); }
Válasz
Az alapul szolgáló matematikai megközelítéshez kérjük, olvassa el a kapcsolódó kérdésemre adott válaszomat itt: a határoló mező kiszámítása az ismert középkoordináták és nagyítás alapján
Képesnek kell lennie a csempén belüli csempe koordinátákról és pixelekről pixel koordinátákká konvertálni, de nem túl nehéz.