Python绘制地图神器folium的新人入门指南
一、简介
想通过 Python 绘制精美的地图?想在地图上自由的设置各种参数?想获得灵活的交互体验?这里就有一款Python 神包满足你:folium。
folium 建立在 Python 生态系统的数据应用能力和 Leaflet.js 库的映射能力之上,在Python中操作数据,然后通过 folium 在 Leaflet 地图中可视化。
folium 相比较于国内百度的 pyecharts 灵活性更强,能够自定义绘制区域,并且展现形式更加多样化。
附:官方文档,官方示例,本文 notebook ,完整代码及数据。
二、安装方法
按照官方的教程即可,如果安装了 conda ,可以直接
conda install -c conda-forge folium
没有安装的话就使用
python3 -m pip install folium
三、主要功能
3.1 各级别地图
folium 显示地图的类为 folium.Map,类的声明如下
class folium.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"
3.1.1 世界地图
import folium print(folium.__version__) # define the world map world_map = folium.Map() # display world map world_map
3.1.2 国家地图
# define the national map national_map = folium.Map(location=[35.3, 100.6], zoom_start=4) # display national map national_map
3.1.3 市级地图
其实改变地图显示就是改变显示的经纬度和缩放比例,省级、市级、县级用法雷同,这里举一个市级的例子为例,如北京市:
# define the city map city_map = folium.Map(location=[39.93, 116.40], zoom_start=10) # display city map city_map
显示效果确实是不如百度的😓。
3.2 地图形式
除了上述正常的地图显示外,folium 还提供了非常丰富的多样化显示,控制显示效果的变量是tiles
,样式有OpenStreetMap
, Stamen Terrain
, Stamen Toner
, Mapbox Bright
, Mapbox Control Room
等等,这里挑选几个比较常见的
# define the city map,tiles='Stamen Toner' city_map = folium.Map(location=[39.93, 116.40], zoom_start=10, tiles='Stamen Toner') # display city map city_map
# define the city map, tiles='Stamen Terrain' city_map = folium.Map(location=[39.93, 116.40], zoom_start=10, tiles='Stamen Terrain') # display city map city_map
3.3 在地图上标记
3.3.1 普通标记
添加普通标记用 Marker
这里可以选择标记的图案。
bj_map = folium.Map(location=[39.93, 115.40], zoom_start=12, tiles='Stamen Terrain') folium.Marker( location=[39.95, 115.33], popup='Mt. Hood Meadows', icon=folium.Icon(icon='cloud') ).add_to(bj_map) folium.Marker( location=[39.96, 115.32], popup='Timberline Lodge', icon=folium.Icon(color='green') ).add_to(bj_map) folium.Marker( location=[39.93, 115.34], popup='Some Other Location', 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='Stamen Toner') folium.Circle( radius=200, location=[39.92, 116.43], popup='The Waterfront', color='crimson', fill=False, ).add_to(bj_map) folium.CircleMarker( location=[39.93, 116.38], radius=50, popup='Laurelhurst Park', color='#3186cc', fill=True, fill_color='#3186cc' ).add_to(bj_map) bj_map
3.3.2 点击获取经纬度
m = folium.Map(location=[46.1991, -122.1889],tiles='Stamen Terrain',zoom_start=13) m.add_child(folium.LatLngPopup()) m
通过点击鼠标便可以获取点击出的经纬度。
3.3.3 动态放置标记
m = folium.Map( location=[46.8527, -121.7649], tiles='Stamen Terrain', zoom_start=13 ) folium.Marker( [46.8354, -121.7325], popup='Camp Muir' ).add_to(m) m.add_child(folium.ClickForMarker(popup='Waypoint')) m
3.4 热力图绘制
因为没有实际的经纬度坐标数据,所以这里只能模拟一些位置出来,另外每个位置还需要一个数值作为热力值。
# generated data import numpy as np data = ( 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]]
绘制热力图
# HeatMap from folium.plugins import HeatMap m = folium.Map([39.93, 116.38], tiles='stamentoner', zoom_start=6) HeatMap(data).add_to(m) # m.save(os.path.join('results', 'Heatmap.html')) m
3.5 密度地图绘制
folium 不仅可以绘制热力图,还可以绘制密度地图,按照经纬度进行举例聚类,然后在地图中显示。
from folium.plugins import MarkerCluster m = folium.Map([39.93, 116.38], tiles='stamentoner', zoom_start=10) # create a mark cluster object marker_cluster = MarkerCluster().add_to(m) # add data point to the mark cluster for lat, lng, label in data: folium.Marker( location=[lat, lng], icon=None, popup=label, ).add_to(marker_cluster) # add marker_cluster to map m.add_child(marker_cluster)
3.6 自定义地图区域
folium 一个非常有优势的功能就是自定义区域的绘制了,只要有区域的边界数据,就可以在地图中以多种多样的形式展现出来,这里以 folium 官方的美国地图为例,源数据是一个 .json
文件,里面包含了各个地区(美国各州)的特征(包括边界经纬度列表、简称等),源数据传送门,其数据格式如下:
3.6.1 只绘制边界,不添加数据
如果只要求绘制边界,而不显示边界区域的相关信息,那么这个是比较容易的,代码如下
import json import requests # read us-states border with open("us-states.json") as f: us_states = json.load(f) us_map = folium.Map(location=[35.3, -97.6], zoom_start=4) folium.GeoJson( us_states, style_function=lambda feature: { 'fillColor': '#ffff00', 'color': 'black', 'weight': 2, 'dashArray': '5, 5' } ).add_to(us_map) #display map us_map
3.6.2 绘制边界,添加数据
当需要在各个区域填充数据的时候,这个稍微麻烦点,不仅需要各个区域的边界数据,还需要各个区域的显示信息,这里同样也使用官方的美国各州的边界数据为例:
import geopandas as gpd import pandas as pd import folium, branca states = 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 一样都可以实现普通的地图绘制功能,但是具体使用还有较大的区别,具体如下表
功能 | pyecharts | folium | 备注 |
---|---|---|---|
世界地图 | 可以 | 可以 | |
中文显示 | 可以 | 部分可以 | folium地图中标尺、文字不能正常显示,但是嵌入地图中的中文可以正常显示 |
交互性 | 好 | 好 | |
区(县)级地图 | 可以 | 可以 | folium需要区(县)边界数据 |
市级地图 | 可以 | 可以 | folium需要市边界数据 |
收费 | 自定义区域需要购买百度ak | 自定义区域功能免费 | |
灵活性 | 好 | 好 | |
省级地图 | 可以 | 可以 | folium需要省边界数据 |
美观度 | 好 | 较好 | |
自定义区域 | 部分可以 | 可以 | pyecharts需要百度 ak,folium免费 |
五、参考资料
[1] https://www.zhihu.com/question/33783546
[2] https://pypi.org/project/folium/
[3] https://nbviewer.jupyter.org/github/python-visualization/folium/tree/master/examples/
到此这篇关于Python绘制地图神器folium的文章就介绍到这了,更多相关Python绘制地图folium内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 这篇文章主要介绍了vue+高德地图实现地图搜索及点击定位操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-09
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- overlay就是在地图上以另外一种形式浮现在地图上,常见的地图覆盖物为这三种类型,如:popup 弹窗、label标注信息、text文本信息等,接下来跟随小编看下openlayers6之地图覆盖物overlay详解,一起看看吧...2021-09-15
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
- 采用CSS覆盖的方法就可以了,但是官方是不允许这么做的...2013-10-13
- 这篇文章主要介绍了React使用高德地图的实现示例(react-amap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-18
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
Python getsizeof()和getsize()区分详解
这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20- 这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05