Python如何绘制地图
这篇文章主要介绍了Python如何绘制地图的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python如何绘制地图文章都会有所收获,下面我们一起来看看吧。
安装方法按照官方的教程即可,如果安装了 conda ,可以直接
condainstall-cconda-forgefolium
没有安装的话就使用
python3-mpipinstallfolium主要功能3.1 各级别地图
folium 显示地图的类为 folium.Map,类的声明如下
classfolium.folium.Map(location=None,width='100%',height='100%',left='0%',top='0%',position='relative',tiles='OpenStreetMap',attr=None,min_zoom=0,max_zoom=18,zoom_start=10,min_lat=-90,max_lat=90,min_lon=-180,max_lon=180,max_bounds=False,crs='EPSG3857',control_scale=False,prefer_canvas=False,no_touch=False,disable_3d=False,png_enabled=False,zoom_control=True,**kwargs)
讲几个重要的参数
location 经纬度,list 或者 tuple 格式,顺序为 latitude, longitude
zoom_start 缩放值,默认为 10,值越大比例尺越小,地图放大级别越大
tiles 显示样式,默认*‘OpenStreetMap'*,也就是开启街道显示
crs 地理坐标参考系统,默认为"EPSG3857"
importfoliumprint(folium.__version__)#definetheworldmapworld_map=folium.Map()#displayworldmapworld_map3.1.2 国家地图
#definethenationalmapnational_map=folium.Map(location=[35.3,100.6],zoom_start=4)#displaynationalmapnational_map3.1.3 市级地图
其实改变地图显示就是改变显示的经纬度和缩放比例,省级、市级、县级用法雷同,这里举一个市级的例子为例,如北京市:
#definethecitymapcity_map=folium.Map(location=[39.93,116.40],zoom_start=10)#displaycitymapcity_map3.2 地图形式
除了上述正常的地图显示外,folium 还提供了非常丰富的多样化显示,控制显示效果的变量是tiles
,样式有OpenStreetMap
, Stamen Terrain
, Stamen Toner
, Mapbox Bright
, Mapbox Control Room
等等,这里挑选几个比较常见的
#definethecitymap,tiles='StamenToner'city_map=folium.Map(location=[39.93,116.40],zoom_start=10,tiles='StamenToner')#displaycitymapcity_map
#definethecitymap,tiles='StamenTerrain'city_map=folium.Map(location=[39.93,116.40],zoom_start=10,tiles='StamenTerrain')#displaycitymapcity_map3.3 在地图上标记3.3.1 普通标记
添加普通标记用 Marker
这里可以选择标记的图案。
bj_map=folium.Map(location=[39.93,115.40],zoom_start=12,tiles='StamenTerrain')folium.Marker(location=[39.95,115.33],popup='Mt.HoodMeadows',icon=folium.Icon(icon='cloud')).add_to(bj_map)folium.Marker(location=[39.96,115.32],popup='TimberlineLodge',icon=folium.Icon(color='green')).add_to(bj_map)folium.Marker(location=[39.93,115.34],popup='SomeOtherLocation',icon=folium.Icon(color='red',icon='info-sign')).add_to(bj_map)bj_map
添加圆形标记用 Circle
以及 CircleMarker
bj_map=folium.Map(location=[39.93,116.40],zoom_start=12,tiles='StamenToner')folium.Circle(radius=200,location=[39.92,116.43],popup='TheWaterfront',color='crimson',fill=False,).add_to(bj_map)folium.CircleMarker(location=[39.93,116.38],radius=50,popup='LaurelhurstPark',color='#3186cc',fill=True,fill_color='#3186cc').add_to(bj_map)bj_map3.3.2 点击获取经纬度
m=folium.Map(location=[46.1991,-122.1889],tiles='StamenTerrain',zoom_start=13)m.add_child(folium.LatLngPopup())m
通过点击鼠标便可以获取点击出的经纬度。
3.3.3 动态放置标记m=folium.Map(location=[46.8527,-121.7649],tiles='StamenTerrain',zoom_start=13)folium.Marker([46.8354,-121.7325],popup='CampMuir').add_to(m)m.add_child(folium.ClickForMarker(popup='Waypoint'))m3.4 热力图绘制
因为没有实际的经纬度坐标数据,所以这里只能模拟一些位置出来,另外每个位置还需要一个数值作为热力值。
#generateddataimportnumpyasnpdata=(np.random.normal(size=(100,3))*np.array([[0.1,0.1,0.1]])+np.array([[40,116.5,1]])).tolist()data[:3]
数据分布
[[40.04666663299843,116.59569796477264,0.9667425547098781],[39.86836537517533,116.28201445195315,0.8708549157348728],[40.08123232852134,116.56884585184197,0.9104952244371285]]
绘制热力图
#HeatMapfromfolium.pluginsimportHeatMapm=folium.Map([39.93,116.38],tiles='stamentoner',zoom_start=6)HeatMap(data).add_to(m)#m.save(os.path.join('results','Heatmap.html'))m3.5 密度地图绘制
folium 不仅可以绘制热力图,还可以绘制密度地图,按照经纬度进行举例聚类,然后在地图中显示。
fromfolium.pluginsimportMarkerClusterm=folium.Map([39.93,116.38],tiles='stamentoner',zoom_start=10)#createamarkclusterobjectmarker_cluster=MarkerCluster().add_to(m)#adddatapointtothemarkclusterforlat,lng,labelindata:folium.Marker(location=[lat,lng],icon=None,popup=label,).add_to(marker_cluster)#addmarker_clustertomapm.add_child(marker_cluster)3.6 自定义地图区域
folium 一个非常有优势的功能就是自定义区域的绘制了,只要有区域的边界数据,就可以在地图中以多种多样的形式展现出来,这里以 folium 官方的美国地图为例,源数据是一个 .json
文件,里面包含了各个地区(美国各州)的特征(包括边界经纬度列表、简称等)
如果只要求绘制边界,而不显示边界区域的相关信息,那么这个是比较容易的,代码如下
importjsonimportrequests#readus-statesborderwithopen("us-states.json")asf:us_states=json.load(f)us_map=folium.Map(location=[35.3,-97.6],zoom_start=4)folium.GeoJson(us_states,style_function=lambdafeature:{'fillColor':'#ffff00','color':'black','weight':2,'dashArray':'5,5'}).add_to(us_map)#displaymapus_map3.6.2 绘制边界,添加数据
当需要在各个区域填充数据的时候,这个稍微麻烦点,不仅需要各个区域的边界数据,还需要各个区域的显示信息,这里同样也使用官方的美国各州的边界数据为例:
importgeopandasasgpdimportpandasaspdimportfolium,brancastates=gpd.GeoDataFrame.from_features(us_states,crs=fiona.crs.from_epsg(4326))states.head()
我们再把收入等数据连接到上表中
abbrs=pd.read_json(open("abbrs.json"))statesmerge=states.merge(abbrs,how='left',left_on='name',right_on='name')statesmerge['geometry']=statesmerge.geometry.simplify(.05)income=pd.read_csv("income.csv",dtype={"fips":str})income['income-2015']=pd.to_numeric(income['income-2015'],errors='coerce')income.groupby(by="state")[['state','income-2015']].median().head()statesmerge['medianincome']=statesmerge.merge(income.groupby(by="state")[['state','income-2015']].median(),how='left',left_on='alpha-2',right_on='state')['income-2015']statesmerge['change']=statesmerge.merge(income.groupby(by="state")[['state','change']].median(),how='left',left_on='alpha-2',right_on='state')['change']statesmerge.head()四、竞品对比与优劣势
国内的竞品为百度的 pyecharts,和 folium 一样都可以实现普通的地图绘制功能,但是具体使用还有较大的区别,具体如下表
中文显示可以部分可以folium地图中标尺、文字不能正常显示,但是嵌入地图中的中文可以正常显示交互性好好
区(县)级地图可以可以folium需要区(县)边界数据市级地图可以可以folium需要市边界数据收费自定义区域需要购买百度ak自定义区域功能免费
灵活性好好
省级地图可以可以folium需要省边界数据美观度好较好
自定义区域部分可以可以pyecharts需要百度 ak,folium免费
关于“Python如何绘制地图”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Python如何绘制地图”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。