之前给大家介绍过多种Python可视化模块,但应用他们进行天文可视化都很简陋。所以想要绘制更精美的可视化地图? 想在地图上自在的设置各种参数?想取得灵便的交互体验?

明天它就来了,Python绘制地图神器folium,上手间接开大!

folium简介和装置

folium 建设在 Python 生态系统的数据利用能力和 Leaflet.js 库的映射能力之上,在Python中操作数据,而后通过 folium 在 Leaflet 地图中可视化。

folium 相比拟于国内百度的 pyecharts 灵活性更强,可能自定义绘制区域,并且展示模式更加多样化。

folium的简介

Folium是建设在 Python 生态系统的数据整顿 Datawrangling 能力和 Leaflet.js 库的映射能力之上的开源库。用 Python 解决数据,而后用 Folium 将它在 Leaflet 地图上进行可视化。Folium可能将通过 Python 解决后的数据轻松地在交互式的 Leaflet 地图上进行可视化展现。它不单单能够在地图上展现数据的分布图,还能够应用 Vincent/Vega 在地图上加以标记。

这个开源库中有许多来自 OpenStreetMap、MapQuest Open、MapQuestOpen Aerial、Mapbox和Stamen 的内建地图元件,而且反对应用 Mapbox 或 Cloudmade 的 API 密钥来定制个性化的地图元件。Folium反对 GeoJSON 和 TopoJSON 两种文件格式的叠加,也能够将数据连贯到这两种文件格式的叠加层,最初可应用 color-brewer 配色计划创立分布图。

Folium能够让你用 Python 弱小生态系统来解决数据,而后用 Leaflet 地图来展现。Folium内置一些来自 OpenStreetMap、MapQuest Open、MapQuest Open Aerial、MapboxStamen 的地图元件(tilesets),并且反对用 Mapbox 或者 Cloudmade API keys 来自定义地图元件。Folium反对 GeoJSON 和 TopJSON 叠加(overlays),绑定数据来发明一个分级统计图(Choropleth map)。然而,Folium库绘制热点图的时候,须要联网才可显示。

装置folium

pip install folium -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

▲这里间接应用了国内豆瓣源

根本应用

folium 显示地图的类为 folium.Map,类的申明如下:

class 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,值越大比例尺越小,地图放大级别越大
  • control_scale:Bool型,管制是否在地图上增加比例尺,默认为 False 即不增加
  • tiles:显示款式,默认 "OpenStreetMap",也就是开启街道显示
  • crs:地理坐标参考零碎,默认为 "EPSG3857"

各级别地图

世界地图

import foliumprint(folium.__version__)# define the world mapworld_map = folium.Map()# save world mapworld_map.save('test_01.html')

后果如下:

以后folium版本:0.11.0

国家地图

import folium# define the national mapnational_map = folium.Map(location=[35.3, 100.6], zoom_start=4)# save national mapnational_map.save('test_02.html')

后果如下:

市级地图

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

import folium# define the national mapcity_map = folium.Map(location=[39.93, 116.40], zoom_start=10)# save national mapcity_map.save('test_03.html')

在地图上标记

一般标记

增加一般标记用 Marker,能够抉择标记的图案。

import foliumbj_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.save('test_04.html')

后果如下:

圆形标记

增加圆形标记用 Circle 以及 CircleMarker

import foliumbj_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='#00FFFF',   # 色彩    fill=False,        # 填充).add_to(bj_map)folium.CircleMarker(    location=(39.93, 116.38),    radius=50,   # 圆的半径    popup='Laurelhurst Park',    color='#FF1493',    fill=True,    fill_color='#FFD700').add_to(bj_map)bj_map.save('test_05.html')

后果如下:

动静搁置标记

import foliumdynamic_tagging = folium.Map(    location=[46.8527, -121.7649],    tiles='Stamen Terrain',    zoom_start=13)folium.Marker(    [46.8354, -121.7325],    popup='Camp Muir').add_to(dynamic_tagging)dynamic_tagging.add_child(folium.ClickForMarker(popup='Waypoint'))dynamic_tagging.save('test_06.html')

后果如下:

实战案例

以将停车场地理位置数据可视化在地图上示例,相熟 folium 地图可视化的应用。

获取经纬度数据

停车场地理位置数据来源于网络,数据实在牢靠,上面先利用 Python 爬虫获取数据

#数据起源:http://219.136.133.163:8000/Pages/Commonpage/login.aspximport requestsimport csvimport jsonimport loggingheaders = {    'X-Requested-With': 'XMLHttpRequest',    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')url = 'http://219.136.133.163:8000/Pages/Commonpage/AsyGetData.asmx/GetParkList's = requests.session()s.get(url, headers=headers)for i in range(1, 318):    data = {        'cp': str(i),        'ps': '10',        'kw': '',        'lon': 'undefined',        'lat': 'undefined',        'type': 'undefined'    }    url = 'http://219.136.133.163:8000/Pages/Commonpage/AsyGetData.asmx/GetParkList'    # post提交表单数据    res = s.post(url, data=data, headers=headers)    # 从新设置编码    res.encoding = 'utf-8'    # str转json  便于提取数据    result = json.loads(res.text)['Result']    for j in result:        park_name = j['ParkName']        Lon = j['Longitude']        Lat = j['Latitude']        with open('parkings.csv', 'a+', newline='', encoding='gb18030') as f:            f_csv = csv.writer(f)            f_csv.writerow([park_name, Lon, Lat])            logging.info([park_name, Lon, Lat])

后果如下:

共有 3170 个停车场地理位置数据

folium地图可视化

import pandas as pdimport folium# 读取csv数据data = pd.read_csv('parkings.csv', encoding='gbk')# 传入纬度和经度数据park_map = folium.Map(location=[data['latitude'].mean(), data['longitude'].mean()], zoom_start=10, control_scale=True,)# 实例化 folium.map.FeatureGroup 对象incidents = folium.map.FeatureGroup()for name,row in data.iterrows():    incidents.add_child(        folium.CircleMarker(            # CircleMarker示意花圆            (row["latitude"], row["longitude"]),   # 每个停车场的经纬度坐标            radius=7,                   # 圆圈半径            color='#FF1493',            # 标记的外圈色彩            fill=True,                  # 是否填充            fill_color='#00FF00',       # 填充色彩            fill_opacity=0.4            # 填充透明度        )    )park_map.add_child(incidents)park_map.save('park_map1.html')

成果如下:

这样看起来有点乱,上面咱们来统计一下各个局域的停车场数量

import pandas as pdimport foliumfrom folium import pluginsdata = pd.read_csv('parkings.csv', encoding='gbk')park_map = folium.Map(location=[data['latitude'].mean(), data['longitude'].mean()], zoom_start=10, control_scale=True,)marker_cluster = plugins.MarkerCluster().add_to(park_map)for name,row in data.iterrows():    folium.Marker(location=[row["latitude"], row["longitude"]]).add_to(marker_cluster)park_map.save('park_map2.html')

成果如下:

这样能对各个局域停车场的数量在地图上进行统计,将图一直放大当前,还能够显示每个停车场的具体位置,十分不便。

以上就是本次分享的所有内容,想要理解更多 Python 常识欢送返回公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。