Google지도 사이트에서 다운로드 한 이미지 타일 세트를 지리 참조하려고합니다. 각 이미지 만 기준으로합니다. “의 Google지도 그리드 참조 및 확대 / 축소 수준, 실제 좌표는 어떻게 계산할 수 있나요?
http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection 는 웹 메르 케이 터 타일에 대한 좌표 및 Google지도 그리드 참조를 보여줍니다.
예를 들어, 가운데 타일은 x=49, y=30, z=6
이고 모서리 좌표 10644926.307106785, 626172.1357121654, 11271098.44281895, 1252344.27142432
:
그리드 참조 및 확대 / 축소 수준 (49, 30, 6)만을 기준으로 코너 좌표를 계산할 수 있습니까?
이것은
gdal을 사용하여 웹 메르 케이 터 타일을 올바르게 지리 참조하는 방법은 무엇입니까? 하지만 온라인에서 아무것도 찾을 필요없이 완전한 프로그래밍 솔루션이 필요합니다. (또는 온라인으로 값을 조회해야하는 경우 프로그래밍 방식이어야합니다.)
편집 :이 스크린 샷은 샘플 타일의 위치를 보여줍니다 (줌 레벨 11, x = 1593, y = 933). . 해당 타일을 어떻게 지리 참조 할 수 있나요?
댓글
- 진정한 타일로 제공됩니까? 주변이 없나요?
- @FelixIP 예, 제가 아는 것은 그리드 참조와 각 개별 JPG의 확대 / 축소 수준뿐입니다. '이를 보여주기 위해 스크린 샷을 추가했습니다. 추신 : 이것이 약간 이상한 일이라는 것을 알고 있지만 때로는해야합니다. 게다가 ' 흥미로운 운동입니다!
- 당신이 할 수 있어야한다고 생각합니다. 줌 레벨과 그리드 참조 만 사용하는 코너 좌표는 내가 아는 한 그리드 참조 시스템이 일정하게 유지되므로이를 수행 할 수있는 방법이 있어야합니다. 확대 / 축소 수준 0은 세계를 1 타일로, 1을 4로 확대하는 식으로 좌표를 얻을 수 있습니다.
- @StephenLead는 각 확대 / 축소에서 세계를 4 개 부분으로 나눌 수 있습니다 ( 반복) 어떻게 든 그것을 사용하여 좌표를 얻습니다. 내 이해로는 ' 반복 함수 여야합니다.
- 이 작업을 수행 할 수 있습니까? 즉, Google지도 용어가이를 허용합니까?
답변
이 페이지 http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection 는 Python으로 작성된 알고리즘을 제공하여 WGS84 데이텀을 사용하여 EPSG : 900913 좌표 및 위도 / 경도로 타일 경계를 계산합니다.
이 스크립트의 GlobalMercator
클래스 http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection / globalmaptiles .py 에는이를 수행하는 TileBounds()
및 TileLatLonBounds()
의 두 가지 메서드가 포함됩니다.
타일 경계 좌표를 표시하는 스크립트 수정 버전 :
#!/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
사용 : tilebounds xTile yTile zoom
.
예를 들어 타일 x=49
, y=30
, z=6
는 다음과 같습니다.
$./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)
http://mt.google.com/vt?x=xTile&y=yTile&z=zoom
URL을 사용하여 타일을 다운로드 할 수 있지만 이것은 직접 액세스 할 수 없습니다.
이 소프트웨어는 원래 Klokan Petr Přidal에 의해 작성되었습니다.
이 정보가 도움이 되었기를 바랍니다.
댓글
- GIS Stack Exchange에 오신 것을 환영합니다. 감사합니다. '이 프로젝트에서 더 이상 작업하지 않기 때문에 내 요구 사항이 통과되었지만이 정보는 향후 다른 사람에게 유용 할 것으로 기대됩니다.
답변
타일, 캐시 된 타일, 지리 참조 등에 대한 토론의 일부로이 문제를 던집니다.
저는 “XY 지리 참조 시스템 자체를 사용하지 않는다는 것을 알고 있습니다 …
예를 들어 ESRI베이스 맵을 QGIS에로드하면 다음과 같은 타일 stache 폴더 구조가 생성됩니다.
최상위 이미지를 볼 때 타일을 요청했으며 다양한 폴더에 저장됩니다.
다음은 f / d 폴더의 내용입니다.
파일 (월드 파일 등)에 지리 참조 정보가 없습니다.
이 파일을 MS로 가져옵니다. 예를 들어 이미지를 조작하고 다시 저장할 수 있습니다.
…따라서 타일을 렌더링하는 QGIS에서지도를 다시 보면 “편집 된”타일을 볼 수 있습니다.
내 말은 Google 어스의 타일 세트가 있다면 이론적으로 타일을 다시 만들 수 있다는 것입니다. 타일을 그 폴더에 넣으면 QGIS에서 그릴 것입니다 …
캐싱 방식과 폴더 구조를 기반으로 타일을 그릴 위치를 아는 것은 소프트웨어 자체입니다 … 이것은 다시 ArcGIS Server 코스를 가르치 던 시절로 거슬러 올라갑니다.
그런 다음 지리 참조 정보와 함께 QGIS에서 내보내고 다른 곳에서 사용할 수 있습니다.
하지만 다시 Google지도를 QGIS에로드하고 이미지를 월드 파일과 함께 TIF로 내보낼 수 있습니다 …
(다시 말하지만 실제로는 대답이 아닙니다. 토론 …)
댓글
- 늦게 답변 해 주셔서 죄송합니다. 솔직히 말해서 ' 프로젝트가 오래 되었기 때문에 왜이 질문을했는지 기억할 수 없습니다.;) 소프트웨어가 언제 어떤 부두교를 하던지 다시 만들어야했다는 것을 기억합니다. 폴더 구조에 따라 이미지를 배치하는 방법을 알고 있습니다.
답변
최근이 문제가 발생했습니다. wiki.openstreetmap.org
에 제공된 코드는 다음과 같습니다.
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))); }
답변
기본 수학적 접근 방식은 여기에서 관련 질문에 대한 제 답변을 참조하세요. 알려진 중심 좌표 및 확대 / 축소에서 경계 상자 계산
타일 내의 타일 좌표와 픽셀에서 픽셀 좌표로 변환 할 수 있어야합니다. 너무 어렵지 않습니다.