问题
folium是一个Python的绘制地图神器,基于leaflet映射。目前有非常多的瓦片图源可以选择,如自带有OpenStreetMap
、Mapbox Bright
、Mapbox Control Room
、Stamen (Terrain, Toner, and Watercolor)
、Cloudmade
、Mapbox
和CartoDB
。以及可以通过这里接入更多的基础地图。但是存在的问题是其中带有的地图都是国外的地图,虽然如OSM等数据多效果好,在国界上都存在问题;而国内的高德、腾讯等地图都存在偏移的问题,天地图虽然没有偏移,但有key的限制。所以在国内使用folium总是不容易两全其美。
解决
参考leaflet中如何优雅的解决百度、高德地图的偏移问题,想到既然folium是基于leaflet的,能不能把这个方法引入修改folium来加载无偏的国内的地图。终于搞定了,参考foliume。
- 目前网上能方便找到的国内的瓦片有高德、百度、腾讯和GeoQ。
- 首先根据网上的开源的坐标转换代码,修改
GridLayer
的方法,加入判断(是否是国内地图)和坐标转换,得到一个js文件。通过jsDelivr + Github 实现免费CDN加速:https://cdn.jsdelivr.net/gh/geoyee/lccjs@v0.2/leaflet_china_correction.js。其中由于百度地图的特殊性,需要构造一个CRS,否则无法显示。 - 为folium添加上述的选项,并把上述的js引入。
- 修改了下setup的名字发了一个pypi包方便使用,可以通过
pip install foliume
下载。
使用
与foliume相同,只需要在指定tiles
的地方选择GeoQ China Community
或GeoQ China Street
即可。
由于pypi不能重名,所以安装是叫foliume,使用和folium一模一样
import folium
m = folium.Map(
location=[39.90681115817056, 116.39123825186597], # 天安门外金水桥
zoom_start=16,
tiles='GeoQ China Community' # 'AMAP China', 'TencentMap China', 'BaiduMaps China'
)
m