python-地图可视化组件folium的操作


Posted in Python onDecember 14, 2020

folium是python的一个用来绘制地图,并在地图上打点,画圈,做颜色标记的工具类。简单易学,和pandas可以很好的融合,是居家必备良品。

一 基本功能演示

import folium
import webbrowser
m=folium.Map(location=[40.009867,116.485994],zoom_start=10) # 绘制地图,确定聚焦点
folium.Marker([40.2,116.7],popup='<b>浮标上面的那个文字</b>').add_to(m) # 定一个点,放到地图m上
folium.Marker([40.22,116.72],popup='<b>浮标上面的那个文字</b>',icon=folium.Icon(color='red')).add_to(m)
# 把浮标变成红色
folium.Marker([40.24,116.74],popup='<b>浮标上面的那个文字</b>',icon=folium.Icon(color='green',icon='info-sign')).add_to(m)
# 浮标改图样
#标记一个空心的圈
folium.Circle(
 location=[40.2,117.7],
 radius=10000,
 color='crimson',
 popup='popup',
 fill=False
).add_to(m)
#标记一个实心圆
folium.CircleMarker(
 location=[39.2,117.7],
 radius=100,
 popup='popup',
 color='#DC143C',#圈的颜色
 fill=True,
 fill_color='#6495ED' #填充颜色
).add_to(m)
m.save('f1.html')
webbrowser.open('f1.html')

另外,folium还支持交互,比如鼠标点击的地方显示经纬度,或者直接在点击过的地方标记一个icon

import folium
import webbrowser as wb
# 地图上悬浮显示经纬度
m = folium.Map(
 location=[36.68159, 117.103565],
 zoom_start=10
)
m.add_child(folium.LatLngPopup())
# 手动打点功能
m.add_child(
 folium.ClickForMarker(popup='Waypoint')
)
m.save('f2.html')
wb.open('f2.html')

二 使用folium绘制散点图,热力图

热力图 ,现实中数据的量级不好控制,有时候用folium画出的热力图,效果往往不是太好。

import numpy as np
import pandas as pd
import seaborn as sns
import folium
import webbrowser
from folium.plugins import HeatMap
#导入数据集:
posi = pd.read_excel("D:/Python/File/Cities2015.xlsx")
posi = posi.dropna()
#生成所需要的数组格式数据:
lat = np.array(posi["lat"][0:len(posi)])
lon = np.array(posi["lon"][0:len(posi)])
pop = np.array(posi["pop"][0:len(posi)],dtype=float)
gdp = np.array(posi["GDP"][0:len(posi)],dtype=float)
data1 = [[lat[i],lon[i],pop[i]] for i in range(len(posi))]
#创建以高德地图为底图的密度图:
map_osm = folium.Map(
 location=[35,110],
 zoom_start=5,
 tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
 attr="© <a href="http://ditu.amap.com/" rel="external nofollow" >高德地图</a>"
 )
#创建以腾讯地图为底图的密度图:
map_osm = folium.Map(
 location=[35,110],
 zoom_start=5,
 tiles='http://rt{s}.map.gtimg.com/realtimerender?z={z}&x={x}&y={y}&type=vector&style=0',
 attr="© <a href="http://map.qq.com/" rel="external nofollow" >腾讯地图</a>"
 )
#生成交互式地图:
HeatMap(data1).add_to(map_osm)
file_path = r"D:/Python/Image/People.html"
map_osm.save(file_path)
webbrowser.open(file_path)

folium的散点图更适合作展示,考虑到加载的顺畅性,不建议读取太大的数据,另外其组件可能会读一些外网的js,如果所在的网络不能访问google可能效果无法展示。解决办法是把里面的js地址替换成国内的镜像。

import pandas as pd
import numpy as np
import os
import folium
from folium import plugins
import webbrowser
import geopandas as gp
#数据导入:
full = pd.read_excel("D:/Python/File/Cities2015.xlsx")
full = full.dropna()
#创建地图对象:
schools_map = folium.Map(location=[full['lat'].mean(), full['lon'].mean()], zoom_start=10)
marker_cluster = plugins.MarkerCluster().add_to(schools_map) 
#标注数据点:
for name,row in full.iterrows():
 folium.Marker([row["lat"], row["lon"]], popup="{0}:{1}".format(row["cities"], row["GDP"])).add_to(marker_cluster) 
#逐行读取经纬度,数值,并且打点
#folium.RegularPolygonMarker([row["lat"], row["lon"]], popup="{0}:{1}".format(row["cities"], row["GDP"]),number_of_sides=10,radius=5).add_to(marker_cluster)
schools_map.save('schools_map.html') #保存到本地
webbrowser.open('schools_map.html') #在浏览器中打开

除此之外folium还可以绘制填充图,填充图比较素颜,如下图

python-地图可视化组件folium的操作

这里有一些官方示例,感兴趣可以看下 :

https://nbviewer.jupyter.org/github/python-visualization/folium/tree/master/examples/

补充:Python遥感可视化 — folium模块展示热力图

“本节通过folium模块来绘制全国PM2.5热力分布图,并生成对应的html文件。”

今天的遥感之美—歌曲《欧若拉》中的阿拉斯加。阿拉斯加州位于北美大陆西北端,东与加拿大接壤,另三面环北冰洋、白令海和北太平洋。卫星俯瞰神秘北极圈,阿拉斯加的山巅,谁的脸出现海角的天边(盗用歌词捂脸)。

python-地图可视化组件folium的操作

哥伦比亚冰川位于美国阿拉斯加州,从海拔3,050米的冰原开始下降,沿着楚加奇山脉的侧翼下降,进入一个狭窄的入口,通往阿拉斯加东南部的威廉王子湾,它是世界上变化最快的冰川之一。科学家使用Landsat 4,5,7和8跟踪哥伦比亚冰川的变化已超过30年。哥伦比亚冰川是一个大型的潮水冰川,最终流入大海。

由Landsat系列卫星捕获的假彩色图像显示了自1986年以来冰川及其周围景观的变化。图像由以下传感器收集—专题制图仪(TM),增强型专题制图仪(ETM +)和陆地成像仪(OLI)—来自四种不同的Landsat卫星(4,5,7和8)。

Landsat图像结合了电磁波谱的短波红外,近红外和绿光波段。通过这种波长组合,雪和冰呈现明亮的青色,植被为绿色,云为白色或浅橙色,水体为深蓝色。暴露的基岩呈棕色,而冰川表面的岩石碎片呈灰色。

在过去三十年里,终点站向北退缩了20公里。在某些年份,终点站退缩了一公里以上,但速度不均匀。例如,终点站的运动在2000年至2006年之间停滞不前,因为大努纳塔克峰和卡丁峰(直接向西)限制了冰川的运动并将冰块固定。自20世纪80年代以来,冰川已经失去了其总厚度和体积的一半左右(译自Landsat官网)。

folium是Python中一个绘制地图的模块,并可以在地图(底图)上打点,画圈,做颜色标记的工具类。简单易学,和pandas可以很好的融合,是地图可视化的一款神器。

在命令行中直接在线安装即可,快速、简洁、方便、高效。

pip install folium

这个开源库中有许多来自OpenStreetMap、MapQuest Open、MapQuestOpen Aerial、Mapbox和Stamen的内建地图组件,而且支持使用Mapbox或Cloudmade的API密钥来定制个性化的地图组件。Folium支持GeoJSON和TopoJSON两种文件格式的叠加,也可以将数据连接到这两种文件格式的叠加层,最后可使用color-brewer配色方案创建分布图。

本节先来展示一下它的简单应用,主要以2018年1月全国1000多个PM2.5地面观测站点为例,将这些数据以热力图(heat map)的形式展现给大家,并生成相应的html文件。

代码实现:

# _*_ coding: utf-8 _*_
__author__ = 'xbr'
__date__ = '2019/1/9 15:47'
 
import numpy as np
import pandas as pd
import folium
import webbrowser
from folium.plugins import HeatMap
 
 
# 读取csv文件,以Dataframe形式保存
df = pd.read_csv(r"D:\data\PM25-20180101.csv")
# 获取数据个数
num = df.shape[0]
# 获取纬度
lat = np.array(df["lat"][0:num])
# 获取经度
lon = np.array(df["lon"][0:num])
# 获取PM2.5,转化为numpy浮点型
pm25 = np.array(df["PM25"][0:num], dtype=float)
# 将数据制作成[lats, lons, weights]的形式
data1 = [[lat[i], lon[i], pm25[i]] for i in range(num)]
# 绘制Map,中心经纬度[32, 120],开始缩放程度是5倍
map_osm = folium.Map(location=[32, 120], zoom_start=5)
# 将热力图添加到前面建立的map里
HeatMap(data1).add_to(map_osm)
 
file_path = r"D:\AirQualityMap.html"
# 保存为html文件
map_osm.save(file_path)
# 默认浏览器打开
webbrowser.open(file_path)

结果图:

python-地图可视化组件folium的操作

对结果图局部放大:

python-地图可视化组件folium的操作

对结果图局部放大:

python-地图可视化组件folium的操作

缩小后全景图:

python-地图可视化组件folium的操作

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
Python用threading实现多线程详解
Feb 03 Python
python如何读写json数据
Mar 21 Python
Python实现base64编码的图片保存到本地功能示例
Jun 22 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
Python实现获取系统临时目录及临时文件的方法示例
Jun 26 Python
Python使用matplotlib实现交换式图形显示功能示例
Sep 06 Python
python实现电子词典
Mar 03 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
Mar 09 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 Python
一篇文章弄懂Python关键字、标识符和变量
Jul 15 Python
详解OpenCV获取高动态范围(HDR)成像
Apr 29 Python
python多线程和多进程关系详解
Dec 14 #Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 14 #Python
pandas将list数据拆分成行或列的实现
Dec 13 #Python
pandas按照列的值排序(某一列或者多列)
Dec 13 #Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
Dec 13 #Python
pandas抽取行列数据的几种方法
Dec 13 #Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 #Python
You might like
PHP文件上传实例详解!!!
2007/01/02 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
Django中使用group_by的方法
2015/05/26 Python
python万年历实现代码 含运行结果
2017/05/20 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
地球上最先进的胡子和头发修剪器:Bevel
2018/01/23 全球购物
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
优秀学生干部推荐材料
2014/02/03 职场文书
报关专员求职信范文
2014/02/22 职场文书
药剂专业毕业生求职信
2014/06/24 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
中秋客户感谢信
2015/01/22 职场文书