赞
踩
一、简介
folium是js上著名的地理信息可视化库leaflet.js为Python提供的接口,通过它,我们可以通过在Python端编写代码操纵数据,来调用leaflet的相关功能。通过定义一个Map对象并不断添加图层元素,最后将Map对象保存为html文件并在浏览器中进行显示。
二、安装
pip3 install folium --user
三、基本用法
- #! /usr/bin/env python
-
- import folium
-
- def run():
- '''创建Map对象'''
- m = folium.Map(location=[39.90,116.38], zoom_start=12, control_scale=True, tiles='CartoDB dark_matter') # 绘制地图,确定聚焦点, # TianAnMen 东经116.38 北纬:39.90
- # location:tuple或list类型输入,用于控制初始地图中心点的坐标,格式为(纬度,经度)或[纬度,经度],默认为None
- # max_zoom:int型,控制地图可以放大程度的上限,默认为18
- # control_scale:bool型,控制是否在地图上添加比例尺,默认为False即不添加
- # height:控制地图的高度,格式同width
- # width:int型或str型,int型时,传入的是地图宽度的像素值;str型时,传入的是地图宽度的百分比,形式为'xx%'。默认为'100%'
- # tiles:str型,用于控制绘图调用的地图样式,默认为'OpenStreetMap',也有一些其他的内建地图样式;也可以传入'None'来绘制一个没有风格的朴素地图,或传入一个URL来使用其它的自选osm
- # 可选的样式包括:OpenStreetMap、Stamen Terrain、Stamen Toner、Stamen Watercolor、CartoDB positron、CartoDB dark_matter、Mapbox Bright等
- # attr:str型,当在tiles中使用自选URL内的osm时使用,用于给自选osm命名
-
- '''画点'''
- lat = 39.90
- lon = 116.38
- folium.Marker([lat,lon], popup='lat:{0:.2f}'.format(lat) + '\nlon:{0:.1f}'.format(lon)).add_to(m) # 定一个点,放到地图m上
- folium.Marker([39.90,116.41], popup='<i>浮标上面的那个文字</i>', icon=folium.Icon(color='red')).add_to(m) # 把浮标变成红色,i为斜体
- folium.Marker([39.90,116.35], popup='<b>浮标上面的那个文字</b>', icon=folium.Icon(color='green', icon='cloud')).add_to(m) # 浮标改图样,icon='info-sign',b为粗体
- # location:同folium.Map()中的同名参数,用于确定标记部件的经纬位置
- # popup:str型或folium.Popup()对象输入,用于控制标记部件的具体样式(folium内部自建了许多样式),默认为None,即不显示部件
- # icon:folium.Icon()对象,用于设置popup定义的部件的具体颜色、图标内容等
-
- '''画圆'''
- name = '天安门'
- position = '39.90,116.38'
- color = ['#FF66CC', '#E2DBF3', '#D3CAEE', '#B7A6E2', '#A895DD', '#9A83D7', '#8C71D1', '#7D60CC', '#6F4EC6',
- '#613DC1', '#5938B0', '#50329E', '#472D8D', '#3E277B', '#35226A', '#2D1C58', '#241747', '#1B1135',
- '#F0EDF9', '#E2DBF3', '#D3CAEE', '#C5B8E8', '#B7A6E2', '#A895DD', '#9A83D7', '#8C71D1', '#7D60CC',
- '#6F4EC6', '#613DC1', '#5938B0', '#50329E', '#472D8D', '#3E277B', '#35226A', '#2D1C58', '#241747',
- '#1B1135', '#F0EDF9'] # 38种
- folium.Circle(location=[39.90,116.38], radius=100, popup="{0}经纬度为:{1}".format(name, position), color='crimson', fill=True, fill_color=color[0]).add_to(m)
- # location:同folium.Map()中的location,用于控制圆圈的圆心坐标
- # radius:int型,用于控制圆圈的半径,单位米,注意,在folium.Circle()中,radius因为半径的单位是米,所以其大小随着我们对地图的缩放程度而进行相应的变化
- # 但在与folium.CircleMarker()方法中的radius参数单位为像素,即其为屏幕上大小固定的一个圆圈,随着地图的缩放,其大小也不会发生变化
- # popup:str型或folium.Popup()对象,用于控制圆圈的样式,默认为None,即无样式
- # color:str型,用于控制圆圈的颜色,默认为十六进制颜色'#3388ff',即一种蓝色
- # fill:bool型,当为True时,圆圈内部将被填充上色彩,默认不填充
- # fill_color:str型,控制圆圈内部填充的色彩,默认与color参数一致
-
- '''画多边形'''
- ls = folium.PolyLine(locations=[[39.91,116.39],[39.89,116.39],[39.89,116.37],[39.91,116.37],[39.91,116.39]], color='blue')
- ls.add_to(m)
- # locations:二级嵌套的list,用于指定需要按顺序连接的坐标点,若要绘制闭合的几何图像,需要在传入列表的首尾传入同样的坐标[lat, lon]
- # color:str型,传入十六进制的颜色,用于控制线条的颜色,默认为'#03f'
- # weight:float型,用于控制线条的宽度,默认为5
- # opacity:float型,用于控制线条的透明度,默认为0.5
- # popup:str型或folium.Popup()对象,用于控制线条样式
-
- '''添加点击显示经纬度的子功能'''
- m.add_child(folium.LatLngPopup())
- '''点击地图任意位置产生一个新的图标'''
- # m.add_child(folium.ClickForMarker())
- # m.add_child(folium.ClickForMarker(popup='Waypoint'))
-
- html_path = '/home/alan/alan_projects/folium_test/test.html'
- m.save(html_path)
- if __name__ == '__main__':
- run()

四、常用案例:根据经纬度文件画轨迹
轨迹文件:/tmp/route.txt
- 24.1764,117.8250
- 24.1766,117.8252
- 24.1761,117.8255
- 24.1762,117.8257
- 24.1759,117.8259
- 24.1687,117.8271
- 24.1735,117.8368
- 24.1761,117.8387
- 24.1747,117.8416
- 24.1703,117.8451
- 24.1637,117.856
- 24.1600,117.8718
- 24.1650,117.8839
- 24.1675,117.8957
- 24.1692,117.9002
- 24.1694,117.9094
- 24.1770,117.9234
- 24.1842,117.9245
- 24.1921,117.9201
- 24.2074,117.9280
- 24.2114,117.9280
- 24.2157,117.9339
- 24.2178,117.9434
- 24.2353,117.9627
- 24.2322,117.9780
- 24.2395,117.9804
- 24.2411,117.9977
- 24.2370,118.0014
- 24.2357,118.0066
- 24.2318,118.0100

- #! /usr/bin/env python
-
- import numpy as np
- import folium
-
- def run():
- file_path = "/tmp/route.txt"
- route = []
- lats, lons = [], []
- for line in open(file_path):
- latlon = line.split(',')
- lat = float(latlon[0])
- lon = float(latlon[1])
- lats.append(lat)
- lons.append(lon)
- route.append([lat, lon])
- center = np.mean(route, axis=0)
- bounds = [[min(lats), min(lons)], [max(lats), max(lons)]]
- # 高德地图
- m = folium.Map(location=center,
- zoom_start=12,
- control_scale=True,
- tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
- attr="http://ditu.amap.com/")
- folium.PolyLine(locations=route,
- color='blue',
- popup=folium.Popup('file_path: {}<br>'.format(file_path), max_width=400),
- opacity=1.0).add_to(m)
- folium.Circle(location=route[0],
- popup=folium.Popup('<b>Start</b><br>'+'lat: {}<br>'.format(route[0][0])+'lon: {}<br>'.format(route[0][1]), max_width=400),
- radius=100,
- color='green',
- fill_color='clear',
- fill=True,
- fill_opacity=0.5).add_to(m)
- folium.Circle(location=route[-1],
- popup=folium.Popup('<b>End</b><br>'+'lat: {}<br>'.format(route[-1][0])+'lon: {}<br>'.format(route[-1][1]), max_width=400),
- radius=100,
- color='red',
- fill_color='clear',
- fill=True,
- fill_opacity=0.5).add_to(m)
- folium.vector_layers.Polygon(locations=[[center[0],center[1]],[center[0]+0.01,center[1]],[center[0]+0.01,center[1]+0.01],[center[0],center[1]+0.01]],
- popup=folium.Popup('direction', max_width=400),
- color='cyan',
- weight=1,
- fill_opacity=0.2,
- opacity=0.5,
- fill=True).add_to(m)
- m.fit_bounds(bounds)
- html_path = '/tmp/test.html'
- m.save(html_path)
- if __name__ == '__main__':
- run()

双击打开生成的html文件,即可在浏览器中看到轨迹
参考:
官方文档:https://python-visualization.github.io/folium/
官方案例:https://nbviewer.jupyter.org/github/python-visualization/folium/tree/master/examples/
- import folium
- from folium.plugins import MousePosition
- from folium.plugins import MeasureControl
- from folium.features import DivIcon
- from folium.features import LatLngPopup
- from folium import IFrame
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。