The Geospatial Information Authority of Japan provides maps, aerial photographs, etc. in the form of Geographical Survey Tiles. To get it, we need a coordinate value called tile coordinates that is not latitude and longitude, so we calculate it. I borrowed the code on the OpenStreetMap wiki.
#from
#https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Python
import math
#Calculate tile coordinates from latitude and longitude
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)
#I will not use it this time, but from the tile coordinates to latitude and longitude
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)
Downloading from Geographical Survey tile looks like this
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))
How to use it is like this. This example is an aerial photograph of the coordinates of the Sky Tree.
#z is the zoom level.18 is the most expanded state
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)
As a result, I got an image like this. It's a photo of the time when it was still under construction.
For def_url, refer to the url in Geographical Survey Tiles List. (Note that it may be jpg or png depending on the object.)