Python绘制地图神器folium的新人入门指南


Posted in Python onMay 23, 2021

一、简介

想通过 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

Python绘制地图神器folium的新人入门指南

3.1.2 国家地图

# define the national map
national_map = folium.Map(location=[35.3, 100.6], zoom_start=4)
# display national map
national_map

Python绘制地图神器folium的新人入门指南

3.1.3 市级地图

其实改变地图显示就是改变显示的经纬度和缩放比例,省级、市级、县级用法雷同,这里举一个市级的例子为例,如北京市:

# define the city map
city_map = folium.Map(location=[39.93, 116.40], zoom_start=10)
# display city map
city_map

Python绘制地图神器folium的新人入门指南

显示效果确实是不如百度的?。

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

Python绘制地图神器folium的新人入门指南

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

Python绘制地图神器folium的新人入门指南

添加圆形标记用 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

Python绘制地图神器folium的新人入门指南

3.3.2 点击获取经纬度

m = folium.Map(location=[46.1991, -122.1889],tiles='Stamen Terrain',zoom_start=13)

m.add_child(folium.LatLngPopup())

m

通过点击鼠标便可以获取点击出的经纬度。

Python绘制地图神器folium的新人入门指南

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

Python绘制地图神器folium的新人入门指南

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

Python绘制地图神器folium的新人入门指南

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)

Python绘制地图神器folium的新人入门指南

3.6 自定义地图区域

folium 一个非常有优势的功能就是自定义区域的绘制了,只要有区域的边界数据,就可以在地图中以多种多样的形式展现出来,这里以 folium 官方的美国地图为例,源数据是一个 .json 文件,里面包含了各个地区(美国各州)的特征(包括边界经纬度列表、简称等),源数据传送门,其数据格式如下:

Python绘制地图神器folium的新人入门指南

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

Python绘制地图神器folium的新人入门指南

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()

Python绘制地图神器folium的新人入门指南

我们再把收入等数据连接到上表中

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()

Python绘制地图神器folium的新人入门指南

最终绘制出的来的地图如下:

Python绘制地图神器folium的新人入门指南

除此之外,还有很多非常有趣的功能,这里就不一一列举了,感兴趣的可以参考官方的文档。

四、竞品对比与优劣势

国内的竞品为百度的 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 相关文章推荐
python实现得到一个给定类的虚函数
Sep 28 Python
十个Python程序员易犯的错误
Dec 15 Python
python处理按钮消息的实例详解
Jul 11 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
python实现的Iou与Giou代码
Jan 18 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
浅谈tensorflow 中的图片读取和裁剪方式
Jun 30 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 Python
python实现三种随机请求头方式
Jan 05 Python
Python关于OS文件目录处理的实例分享
May 23 #Python
python引入其他文件夹下的py文件具体方法
Python 解决空列表.append() 输出为None的问题
May 23 #Python
Python - 10行代码集2000张美女图
python办公自动化之excel的操作
May 23 #Python
python爬取豆瓣电影TOP250数据
May 23 #Python
基于Python绘制子图及子图刻度的变换等的问题
You might like
超级简单的php+mysql留言本源码
2009/11/11 PHP
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
js实现表格筛选功能
2017/01/18 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
2018/05/21 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
Python中dictionary items()系列函数的用法实例
2014/08/21 Python
python函数局部变量用法实例分析
2015/08/04 Python
Unicode和Python的中文处理
2017/03/19 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
python3+PyQt5实现柱状图
2018/04/24 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
Flask之请求钩子的实现
2018/12/23 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
贸易经济专业自荐书
2014/06/29 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
学习三严三实心得体会
2014/10/13 职场文书
故宫导游词
2015/01/31 职场文书
医生个人年终总结
2015/02/28 职场文书
车间统计员岗位职责
2015/04/14 职场文书
Go中的条件语句Switch示例详解
2021/08/23 Golang