地图数据可视化库folium

一、简介

  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,用于指定需要按顺序连接的坐标点,若要绘制闭合的几何图像,需要在传入列表的首尾传入同样的坐标
  # 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 = []
  for line in open(file_path):
    latlon = line.split(',')
    lat = float(latlon[0])
    lon = float(latlon[1])
    route.append([lat, lon])
  center = np.mean(route, axis=0)
  # 高德地图
  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(route).add_to(m)

  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/ 

猜你喜欢

转载自blog.csdn.net/A_L_A_N/article/details/103375191