前言

每年都會到日本玩的人越來越多,自駕的也不在少數。但如果有自駕過的人就會知道,因為語言不同,在輸入導航時常常要查很久,甚至有時候連輸入都不會。還好日本導航系統很完整,除了可以輸入電話之外,也可以使用日本獨有地圖資料系統 MapCode (マップコード)。

MapCode 透過將地圖不斷細分劃格的方式,藉此標示出地點的詳細位置資訊,共由 9 ~ 10 個數字所組成。可以在導航前,事先在家裡在官網上輸入地址,查好景點的 Mapcode 。但是有用過的就會發現,日本的地址不太會打,外加輸入繁體字常常會搜尋不到,所以本文章使用大家熟悉的 google map 來做轉換。透過 google api 把地址轉換成經緯度,再利用爬蟲將經緯度轉換成 mapcode 。


功能說明

TransLatLng

將查詢的地址轉換成經緯度,解碼器由 google 提供,如需大量使用請改使用Google Maps API,預設地址為東京

1
2
3
4
5
6
7
8
def TransLatLng(self, query='東京'):
self.LocationParams = {'address': query}
r = requests.get(self.LocationURL, params = self.LocationParams)
responseJson = json.loads(r.text)
lat = responseJson.get('results')[0]['geometry']['location']['lat']
lng = responseJson.get('results')[0]['geometry']['location']['lng']
address = responseJson.get('results')[0]['formatted_address']
return [lat, lng, address]

範例

1
2
3
4
import mapcode

example = mapcode.Mapcode()
print (example.TransLatLng('福岡塔'))

輸出

1
2
# [緯度, 經度, 地址]
[33.5932642, 130.3515144, '2 Chome-3-26 Momochihama, Sawara Ward, Fukuoka, Fukuoka Prefecture 814-0001, Japan']

TransMapcode

將經緯度轉換成 mapcode

1
2
3
4
5
6
def TransMapcode(self, lat, lon):
self.MapcodeParams = {'address': '', 'lat': lat, 'lon' : lon, 'scl' : 16, 'layer' : ''}
r = requests.get(self.MapcodeURL, params = self.MapcodeParams)
soup = BeautifulSoup(r.text, "html.parser")
mapcode = soup.find('input', attrs={'id':'find', 'name':'find', 'type':'text'})['value']
return mapcode

範例

1
2
3
4
import mapcode

example = mapcode.Mapcode()
print (example.TransMapcode(33.5932642, 130.3515144))

輸出

1
13 312 703*43

完整程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import requests
from bs4 import BeautifulSoup
import json
import sys

class Mapcode:
def __init__(self):
self.LocationParams = {'address': '東京'}
self.LocationURL = 'http://maps.googleapis.com/maps/api/geocode/json'
self.NameURL = 'https://www.mapion.co.jp/m2/'
self.MapcodeParams = {'address': '東京都文京区関口1丁目', 'lat': '35.7090259', 'lon' : '139.7319925', 'scl' : 16, 'layer' : ''}
self.MapcodeURL = 'https://www.mapion.co.jp/f/mmail/send_mobile/SendMobile_map.html'

def TransLatLng(self, query='東京'):
self.LocationParams = {'address': query}
r = requests.get(self.LocationURL, params = self.LocationParams)
responseJson = json.loads(r.text)
lat = responseJson.get('results')[0]['geometry']['location']['lat']
lng = responseJson.get('results')[0]['geometry']['location']['lng']
address = responseJson.get('results')[0]['formatted_address']

# r = requests.get(self.NameURL + str(lat) + ',' + str(lng) + ',16')
# soup = BeautifulSoup(r.text, "html.parser")
# data = soup.find('meta', attrs={'name':'Keywords'})['content'].split(',')
# address = data[0]
# return [lat, lng, address, place]
return [lat, lng, address]


def TransMapcode(self, lat, lon):
self.MapcodeParams = {'address': '', 'lat': lat, 'lon' : lon, 'scl' : 16, 'layer' : ''}
r = requests.get(self.MapcodeURL, params = self.MapcodeParams)
soup = BeautifulSoup(r.text, "html.parser")
mapcode = soup.find('input', attrs={'id':'find', 'name':'find', 'type':'text'})['value']
return mapcode