項(xiàng)目地址
說明
項(xiàng)目的目標(biāo)是爬取高德、谷歌的瓦片地圖資源栏渺,并利用 Flask + Leaflet 制作一個(gè)離線的瓦片地圖服務(wù)。
爬取瓦片地圖采用了多進(jìn)程/多線程/異步三種方式進(jìn)行倾芝,并比較三種方式的效率论衍。
1. 獲取瓦片地圖
1.1 主要地圖瓦片坐標(biāo)系定義及計(jì)算原理
瓦片地圖具有如下特點(diǎn):
具有唯一的瓦片等級和瓦片坐標(biāo)編號堰燎;
分辨率為 256*256基矮;
瓦片等級越高淆储,展示的地圖信息約詳盡,瓦片數(shù)量也越多愈捅;
上一等級的一張瓦片地圖可分割為下一等級的四張瓦片地圖遏考。
參考文章: 《國內(nèi)主要地圖瓦片坐標(biāo)系定義及計(jì)算原理》
1.2 pyGeoTile 庫的使用(計(jì)算瓦片地圖坐標(biāo))
GitHub: https://github.com/geometalab/pyGeoTile
安裝:pip install pygeotile
from pygeotile.tile import Tile
lon, lat = 109.227, - 20.196
zoom = 12
tile = Tile.for_latitude_longitude(latitude = lat, longitude = lon, zoom = zoom)
print('mintile', 'X:', tile.tms_x, 'Y:', tile.tms_y, 'zoom:', tile.zoom)
1.3 多進(jìn)程/多線程/異步爬取瓦片地圖
高德瓦片地圖鏈接:http://wprd03.is.autonavi.com/appmaptile?style=7&x={x}&y={y}&z={z}
谷歌瓦片地圖鏈接:http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}&s=Galil
三種方式爬取等級12瓦片地圖(6164張圖片)的效率對比
爬取方式:使用時(shí)間(秒)
多進(jìn)程:24.49594s
多線程:16.11365s
異步:14.01809s
2. Flask + Leaflet 瓦片地圖
2.1 瓦片地圖路由定義
@app.route("/tile")
def tile():
x = request.args['x']
y = request.args['y']
z = request.args['z']
with open('./tilefile/%s/%s_%s.png'%(z, x, y), 'rb') as f:
image = f.read()
return Response(image, mimetype='image/jpeg')
- 瓦片地圖接口 url: /tile?x={x}&y={y}&z={z}
2.2 Leaflet 地圖庫 使用
GitHub:https://github.com/Leaflet/Leaflet
var url = '/tile?x={x}&y={y}&z={z}';
var latlng = new L.latLng(23.461, 111.921);
var map = new L.map('mapDiv', {
center: latlng,
zoom: 4,
detectRetina: true
});
L.tileLayer(url).addTo(map);