做分析图的时候经常需要用到不同风格的底图,但是当前这方面工具在国内国外、地图样式上总是不尽如人意。下面是我找到最快捷好用的解决方案:
首先推荐一个底图合集:http://openwhatevermap.xyz
import folium
''
1、设置经纬度
高德坐标拾取器(中国) https://lbs.amap.com/console/show/picker
谷歌地图邮件坐标(外国)https://www.google.com/maps
伦敦:51.51061318975203, -0.12632461453674496
上海:121.473658,31.230378 / 31.23292205448941, 121.48930834858014
'''
latitude = 31.213
longitude = 121.445
'''
2、选择底图
黑白风 http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png
水彩风 http://{s}.tile.stamen.com/watercolor/{z}/{x}/{y}.jpg
'''
map = folium.Map(location=[latitude, longitude], zoom_start=12,
tiles='http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',attr='default')
如果需要的话,还可以做一些简单的shp数据可视化,以及热力图的分析:
import pandas as pd
from folium.plugins import HeatMap
'''
3、读取数据并添加到地图
'''
cdata = pd.read_excel('./上海文化点/文旅局汇总.xlsx')
spots = folium.map.FeatureGroup()
df1 = cdata[cdata['类型']=='博物馆']
df2 = cdata[cdata['类型']=='图书馆']
df3 = cdata[cdata['类型']=='美术馆']
df4 = cdata[cdata['类型']=='剧院剧场']
for lat, lng, in zip(df1.lat, df1.lng):
spots.add_child(
folium.CircleMarker(
[lng, lat],
radius=5,
color='white',
fill=True,
fill_color='red',
fill_opacity=0.4,
)
)
for lat, lng, in zip(df2.lat, df2.lng):
spots.add_child(
folium.CircleMarker(
[lng, lat],
radius=5,
color='white',
fill=True,
fill_color='blue',
fill_opacity=0.4,
)
)
for lat, lng, in zip(df3.lat, df3.lng):
spots.add_child(
folium.CircleMarker(
[lng, lat],
radius=5,
color='white',
fill=True,
fill_color='green',
fill_opacity=0.4,
)
)
for lat, lng, in zip(df4.lat, df4.lng):
spots.add_child(
folium.CircleMarker(
[lng, lat],
radius=5,
color='white',
fill=True,
fill_color='orange',
fill_opacity=0.4,
)
)
heatdata = cdata[['lat_wgs','lng_wgs']].values.tolist()
HeatMap(heatdata).add_to(map)
map.add_child(spots)
最后保存为html格式,用浏览器就可以打开啦,地图可以放大缩小,样式从底图合集里看哦
'''
4、保存网页
'''
map.save('./maparea.html')