LoginSignup
1
2

More than 3 years have passed since last update.

緯度経度から地理院タイルをダウンロードする

Last updated at Posted at 2020-02-12

国土地理院は地図や航空写真等を地理院タイルという形で提供している
取得するにはタイル座標という緯度経度ではない座標値が必要なので,それを計算する.
OpenStreetMapのwikiにそのコードがあるので拝借.

#from
#https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Python

import math

#緯度経度からタイル座標を計算
def deg2num(lat_deg, lon_deg, zoom):
    lat_rad = math.radians(lat_deg)
    n = 2.0 ** zoom
    xtile = int((lon_deg + 180.0) / 360.0 * n)
    ytile = int((1.0 - math.asinh(math.tan(lat_rad)) / math.pi) / 2.0 * n)
    return (xtile, ytile)

#今回は使わないけど,タイル座標から緯度経度
def num2deg(xtile, ytile, zoom):
    n = 2.0 ** zoom
    lon_deg = xtile / n * 360.0 - 180.0
    lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n)))
    lat_deg = math.degrees(lat_rad)
    return (lat_deg, lon_deg)

地理院タイルからのダウンロードはこんな感じ

import requests
def download_from_gsi(z, x, y, def_url, fname):
    url = def_url.format(z,x,y)
    response = requests.get(url)
    if response.status_code == 200:
        image = response.content
        with open(fname, "wb") as f:
            f.write(image)
    else:
        raise Exception("{} returned {}".format(response.url, response.status_code))

使い方はこんな感じ.この例はスカイツリーの座標の航空写真です.

#zはズームレベル.18が一番拡大した状態
z = 17
lat = 35.710163
lon = 139.8105428

def_url = "https://cyberjapandata.gsi.go.jp/xyz/ort/{}/{}/{}.jpg"
fname ="test.png"

x,y = deg2num(lat, lon, z)

download_from_gsi(z, x, y, def_url, fname)

結果このような画像が取れました.
test.png
まだ建設途中のころの写真ですね.

def_url は地理院タイル一覧中にあるurlを参考にしてください.
(注意点は物によってjpgだったりpngだったりするところ.)

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2