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のグリッド参照とズームレベルだけです。 'これを示すスクリーンショットを追加しました。 PSこれは少し危険だと思いますが、実行する必要がある場合もあります。さらに、'興味深い演習です!
  • 取得できるはずです。私の知る限り、ズームレベルとグリッド参照のみを使用したコーナー座標は一定のままなので、これを行う方法が必要です。ズームレベル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()の2つのメソッドが含まれています。

タイル境界座標を表示するためのスクリプトの修正バージョン:

 #!/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=49y=30z=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) 

タイルはURL http://mt.google.com/vt?x=xTile&y=yTile&z=zoomでダウンロードできますが、これは直接アクセスすることは禁じられています。

このソフトウェアは、もともとKlokanPetrPřidalによって作成されました。

これがお役に立てば幸いです!

コメント

  • GIS Stack Exchangeへようこそ、そしてこれに感謝します。 'がこのプロジェクトに取り組んでいないため、私の要件は満たされましたが、この情報が将来他の誰かに役立つことを願っています

回答

タイル、キャッシュされたタイル、地理参照などに関する議論の一部としてこれを投げ入れるだけです。

何からのタイリングスキームXYジオリファレンスシステム自体を使用しないことはわかっています…

たとえば、ESRIベースマップをQGISにロードすると、次のようなタイルスタックフォルダ構造が作成されます。

ここに画像の説明を入力

トップレベルの画像を表示すると、次のようになります。タイルをリクエストすると、それらはさまざまなフォルダに保存されます。

f / dフォルダの内容は次のとおりです:

ここに画像の説明を入力してください

ファイル(ワールドファイルなど)に地理参照情報がないことに注意してください

いつこのファイルをMSに持ち込むたとえば、ペイントすると、画像を操作して再保存できます。

ここに画像の説明を入力

..。したがって、タイルをレンダリングしているQGISでマップを再度表示すると、「編集された」タイルが表示されます。

ここに画像の説明を入力してください

つまり、Google Earthのタイルのセットがあれば、理論的にはタイルを再作成できると思います。構造化し、タイルをそれらのフォルダーに配置するだけで、QGISで描画されます…

キャッシュスキームとフォルダー構造に基づいてタイルを描画する場所を知っているのは、ソフトウェア自体です…これもまた、ArcGISServerコースを教えていた日々にさかのぼります。

次に、ジオリファレンス情報を使用して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))); } 

回答

基礎となる数学的アプローチについては、関連する質問に対する私の回答を参照してください:既知の中心座標とズームから境界ボックスを計算する

タイル内のタイル座標とピクセルからピクセル座標に変換できる必要がありますが、それはそれほど難しくはありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です