Python筆記八:簡(jiǎn)單瓦片下載工具pyMap
這是一個(gè)簡(jiǎn)單的實(shí)例,去實(shí)現(xiàn)地圖下載工具。如今又很多瓦片的下載工具,但是都是收費(fèi)的,感覺(jué)奇怪的是既然是盜版還要收費(fèi)。我決心用python寫一個(gè)簡(jiǎn)單瓦片地圖下載器,將瓦片下載拼接成對(duì)應(yīng)的圖片。
經(jīng)供參考,不要從事商業(yè)用途,后果自負(fù)。
依賴
- python3.5
- requests 負(fù)責(zé)下載功能
- pillow 負(fù)責(zé)圖片拼接
- tqdm 負(fù)責(zé)進(jìn)度條
安裝
安裝python3.5
安裝對(duì)應(yīng)的第三方庫(kù)
pip install -r requirement.txt
原理
兩個(gè)主要函數(shù)分別是process_latlng
和process_tilenum
。前者使用經(jīng)緯度進(jìn)行處理,如osm,mapbox,天地圖等。其中將經(jīng)緯度轉(zhuǎn)換成為瓦片編號(hào),然后使用后者的方法。后者采用瓦片編號(hào)去下載瓦片。
由于有些地圖系統(tǒng)的瓦片編號(hào),經(jīng)加密后十分怪異,如百度地圖。
下載瓦片則是采用request
獲取下載到指定的文件夾。
最后將瓦片地圖進(jìn)行拼接,運(yùn)用pillow
的在指定位置粘貼的方法,得到最后的成果。
output_im = Image.new("RGB", (size_x, size_y))
for x in trange(left, right + 1):
for y in trange(top, bottom + 1):
path = './tiles/%i/%i/%i' % (zoom, x, y)
target_im = Image.open(path)
output_im.paste(target_im, (256 * (x - left), 256 * (y - top)))
用法
使用前,將對(duì)應(yīng)的經(jīng)緯度查看對(duì)應(yīng)左上和右下的坐標(biāo)。
運(yùn)用命令行
python pyMap.py 22.456671 113.889962 22.345576 114.212686 13 output/sample.png
- 參數(shù)1: 西北角緯度
- 參數(shù)2: 西北角經(jīng)度
- 參數(shù)3: 東南角緯度
- 參數(shù)4: 東南角經(jīng)度
- 參數(shù)5: 比例尺級(jí)別
- 參數(shù)6: 輸出路徑(默認(rèn)'output/mosaic.png')
hard code test function
請(qǐng)自修修改,下面是通過(guò)經(jīng)緯度下載數(shù)據(jù)。
def test():
process_latlng(22.4566710000, 113.8899620000, 22.3455760000, 114.2126860000, 13)
或者通過(guò)瓦片編號(hào)下載數(shù)據(jù)。
def test():
process_tilenum(1566, 1788, 1976, 2149, 9, "output/overlay.png")
考慮到谷歌地圖
由于谷歌地圖的數(shù)據(jù)最清晰,我想爬谷歌的數(shù)據(jù),但是谷歌地圖需要翻墻,而requests不能直接翻墻。所以我參考了lantern訪問(wèn)中文維基百科及selenium爬取維基百科語(yǔ)料。
源碼github地址在此,記得點(diǎn)星:
https://github.com/brandonxiang/pyMap_GFW
通過(guò)selenium控制瀏覽器截圖,但是網(wǎng)速的限制導(dǎo)致成功率下降,給后期處理帶來(lái)巨大麻煩。該項(xiàng)目已棄用,如果有更好方法請(qǐng)?jiān)u論留言。
最后
結(jié)合所有的內(nèi)容,網(wǎng)頁(yè)版本為Python 筆記八(續(xù)):瓦片下載器網(wǎng)頁(yè)版pyMap-webapp