Tkinterからのコマンドでブラウザ上に静的GoogleMapを表示するブラウザからGoogleMapsで住所を入力して検索すればいいだけなのですが、一応、練習ということで…。 split()を使用していますので python3.x系でしか動作しません。 (試していないので判りませんが)mapTypeの箇所をリストに、tkinterをTkinterに変更すれば2.x系でも動作すると思います。
|
|
【住所】欄に検索したい住所を入力して【実行】ボタンを押すと、ブラウザが立ち上がりマップが表示されます。
#!/usr/bin/env python
# coding=utf-8
from tkinter import * #@UnusedWildImport
import webbrowser
import os
import urllib.parse
class GetMap(object):
def __init__(self):
# attributes -----------------------------------------------------------------
self.TITLE = 'Google Map の表示'
self.ICON = 'rogmic.ico' # 適当にご自身でアイコンを作ってください
self.EXPLAIN = '住所の入力'
self.EXECUTE = '実行'
self.QUIT = '終了'
self.RELIEF = 'groove'
self.PADXY = 2
# TK Setting------------------------------------------------------------------
self.root = Tk()
self.root.title(self.TITLE)
self.root.wm_iconbitmap(self.ICON)
# Frame Setting---------------------------------------------------------------
self.frm_Main = Frame(self.root)
self.frm_Main.configure(padx = self.PADXY, pady = self.PADXY)
self.frm_Main.pack()
# ラベル Setting--------------------------------------------------------------
self.lbl_Address = Label(self.frm_Main)
self.lbl_Address.configure(text = self.EXPLAIN)
self.lbl_Address.pack(side = LEFT)
# バッファとエントリ Setting--------------------------------------------------
self.bffEntryAddress = StringVar()
self.bffEntryAddress.set('')
self.entry_Address = Entry(self.frm_Main)
self.entry_Address.configure(textvariable = self.bffEntryAddress, width = 50)
self.entry_Address.pack(side = LEFT)
self.entry_Address.focus_force()
# 実行ボタン------------------------------------------------------------------
self.btn_Exe = Button(self.frm_Main)
self.btn_Exe.configure(text = self.EXECUTE,
relief = self.RELIEF,
command = self.getGoogleMap)
self.btn_Exe.pack(side = LEFT)
# 終了ボタン------------------------------------------------------------------
self.btn_Quit = Button(self.frm_Main)
self.btn_Quit.configure(text = self.QUIT,
relief = self.RELIEF,
command = self.root.destroy)
self.btn_Quit.pack(side = LEFT)
# メインループ----------------------------------------------------------------
self.root.mainloop()
# --------------------------------------------------------------------------------
def getGoogleMap(self):
"""
# エントリーに入力された住所をGetしてブラウザにGoogleMapを表示
"""
address = self.bffEntryAddress.get()
MY_DIR = os.getcwd()
mapType = 'roadmap satellite hybrid terrain'.split() # MAP_TYPEで設定
ADDRESS = address.encode('utf-8')
ZOOM = '18' # ズーム レベル
SIZE = '480x480' # 640x640 は画像の最大サイズ
MARKERS = 'color:blue|label:S|' # 地図上のマーカー表示
MAPTYPE = mapType[0] # どのタイプの地図を表示するか選択
setting = {
'center' : ADDRESS,
'zoom' : ZOOM,
'size' : SIZE,
'markers' : MARKERS + address,
'maptype' : MAPTYPE
}
SETTING = urllib.parse.urlencode(setting)
MAP_URL = "https://maps.google.com/maps/api/staticmap?" + SETTING + "&sensor=false"
MY_HTML = """
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift-jis" />
<title>Google Maps 表示</title>
</head>
<body>
<p>map</p>
<img src="{mapUrl}" />
<p>{address}</p>
</body>
</html>""".format(mapUrl = MAP_URL, address = address)
file = open('googleMap.html', mode='w')
file.write(MY_HTML)
file.close()
webbrowser.open('{dir}\{htmlFile}'.format(dir = MY_DIR, htmlFile = 'googleMap.html'))
if __name__ == '__main__':
myApp = GetMap()
静的なマップ表示のAPIについては、Googleさんの Static Maps API V2 デベロッパー ガイド を参考にしてください。
GoogleさんのHPにあるように静的マップの URL は、下記のように指定する必要があります。
http://maps.google.com/maps/api/staticmap?parameters
staticmap?以降に、center,zoom,sizeといったパラメータを"center=●●&zoom=◇◇"といった形で渡せ、ということですね。
この処理に使用するのがurllib.parse.urlencode()です。
urlencode()の引数部分にDictionary形式で値を渡してあげればOKです。
例1
#!/usr/bin/env python
# coding=utf-8
import urllib.parse
address = {
'center' : 'rogmicartの住所'.encode('utf-8'),
'zoom' : '18'}
ADDRESS = urllib.parse.urlencode(address)
print(ADDRESS)
実行結果 center=rogmicart%E3%81%AE%E4%BD%8F%E6%89%80&zoom=18
これをhttp://maps.google.com/maps/api/staticmap?以下にガッチャンコするには下記の通りすれば Googleさんが欲しているものが出来上がります。
例2
#!/usr/bin/env python
# coding=utf-8
import urllib.parse
parameters = {
'zoom' : '18',
'size' : '640x640'
}
PARAMETERS = urllib.parse.urlencode(parameters)
mapUrl = 'http://maps.google.com/maps/api/staticmap?' + PARAMETERS
print(mapUrl)
実行結果 http://maps.google.com/maps/api/staticmap?zoom=18&size=640x640
上記のプログラムはマップのサイズやタイプが固定となっているのでGUI上から、それらの値を変更したい場合は、
ラジオボタンなどを組込み下記のように作り上げてみるのも面白いかと思います。
urllibモジュールは使い勝手が良く、GAE(google App Engine)を利用してHP上での表示も可能です
(↓こちらはpython2.7で作成)。