本篇內(nèi)容主要講解“如何安裝Python繪制地圖神器folium”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何安裝Python繪制地圖神器folium”吧!
10余年的芙蓉網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整芙蓉建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“芙蓉網(wǎng)站設(shè)計(jì)”,“芙蓉網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
folium 建立在 Python 生態(tài)系統(tǒng)的數(shù)據(jù)應(yīng)用能力和 Leaflet.js 庫(kù)的映射能力之上,在Python中操作數(shù)據(jù),然后通過 folium 在 Leaflet 地圖中可視化。
folium 相比較于國(guó)內(nèi)百度的 pyecharts 靈活性更強(qiáng),能夠自定義繪制區(qū)域,并且展現(xiàn)形式更加多樣化。[1]
1. folium的簡(jiǎn)介
Folium是建立在 Python 生態(tài)系統(tǒng)的數(shù)據(jù)整理 Datawrangling 能力和 Leaflet.js 庫(kù)的映射能力之上的開源庫(kù)。用 Python 處理數(shù)據(jù),然后用 Folium 將它在 Leaflet 地圖上進(jìn)行可視化。Folium能夠?qū)⑼ㄟ^ Python 處理后的數(shù)據(jù)輕松地在交互式的 Leaflet 地圖上進(jìn)行可視化展示。它不單單可以在地圖上展示數(shù)據(jù)的分布圖,還可以使用 Vincent/Vega 在地圖上加以標(biāo)記。
這個(gè)開源庫(kù)中有許多來(lái)自 OpenStreetMap、MapQuest Open、MapQuestOpen Aerial、Mapbox和Stamen 的內(nèi)建地圖元件,而且支持使用 Mapbox 或 Cloudmade 的 API 密鑰來(lái)定制個(gè)性化的地圖元件。Folium支持 GeoJSON 和 TopoJSON 兩種文件格式的疊加,也可以將數(shù)據(jù)連接到這兩種文件格式的疊加層,最后可使用 color-brewer 配色方案創(chuàng)建分布圖。
Folium可以讓你用 Python 強(qiáng)大生態(tài)系統(tǒng)來(lái)處理數(shù)據(jù),然后用 Leaflet 地圖來(lái)展示。Folium內(nèi)置一些來(lái)自 OpenStreetMap、MapQuest Open、MapQuest Open Aerial、Mapbox和Stamen 的地圖元件(tilesets),并且支持用 Mapbox 或者 Cloudmade API keys 來(lái)自定義地圖元件。Folium支持 GeoJSON 和 TopJSON 疊加(overlays),綁定數(shù)據(jù)來(lái)創(chuàng)造一個(gè)分級(jí)統(tǒng)計(jì)圖(Choropleth map)。但是,F(xiàn)olium庫(kù)繪制熱點(diǎn)圖的時(shí)候,需要聯(lián)網(wǎng)才可顯示。
2. 安裝folium
pip install folium -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
?這里直接使用了國(guó)內(nèi)豆瓣源
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)
幾個(gè)重要的參數(shù):
location:經(jīng)緯度,list 或者 tuple 格式,順序?yàn)?latitude, longitude
zoom_start:縮放值,默認(rèn)為 10,值越大比例尺越小,地圖放大級(jí)別越大
control_scale:Bool型,控制是否在地圖上添加比例尺,默認(rèn)為 False 即不添加
tiles:顯示樣式,默認(rèn) "OpenStreetMap",也就是開啟街道顯示
crs:地理坐標(biāo)參考系統(tǒng),默認(rèn)為 "EPSG3857"
1. 各級(jí)別地圖
世界地圖
import folium print(folium.__version__) # define the world map world_map = folium.Map() # save world map world_map.save('test_01.html')
結(jié)果如下:
當(dāng)前folium版本:0.11.0
國(guó)家地圖
import folium # define the national map national_map = folium.Map(location=[35.3, 100.6], zoom_start=4) # save national map national_map.save('test_02.html')
結(jié)果如下:
市級(jí)地圖
其實(shí)改變地圖顯示也就是改變顯示的經(jīng)緯度和縮放比例,省級(jí)、市級(jí)、縣級(jí)用法相似,這里舉一個(gè)市級(jí)的例子為例,如北京市:
import folium # define the national map city_map = folium.Map(location=[39.93, 116.40], zoom_start=10) # save national map city_map.save('test_03.html')
2. 在地圖上標(biāo)記
普通標(biāo)記
添加普通標(biāo)記用 Marker,可以選擇標(biāo)記的圖案。
import folium 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') # 標(biāo)記顏色 圖標(biāo) ).add_to(bj_map) bj_map.save('test_04.html')
結(jié)果如下:
圓形標(biāo)記
添加圓形標(biāo)記用 Circle 以及 CircleMarker
import folium 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='#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')
結(jié)果如下:
動(dòng)態(tài)放置標(biāo)記
import folium dynamic_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')
結(jié)果如下:
更多詳細(xì)使用可以參考官方文檔:http://python-visualization.github.io/folium/quickstart.html[2]
以將停車場(chǎng)地理位置數(shù)據(jù)可視化在地圖上示例,熟悉 folium 地圖可視化的使用。
1. 獲取經(jīng)緯度數(shù)據(jù)
停車場(chǎng)地理位置數(shù)據(jù)來(lái)源于網(wǎng)絡(luò),數(shù)據(jù)真實(shí)可靠,下面先利用 Python 爬蟲獲取數(shù)據(jù)
#數(shù)據(jù)來(lái)源:http://219.136.133.163:8000/Pages/Commonpage/login.aspx import requests import csv import json import logging headers = { '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提交表單數(shù)據(jù) res = s.post(url, data=data, headers=headers) # 重新設(shè)置編碼 res.encoding = 'utf-8' # str轉(zhuǎn)json 便于提取數(shù)據(jù) 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])
結(jié)果如下:
共有 3170 個(gè)停車場(chǎng)地理位置數(shù)據(jù)
2. folium地圖可視化
import pandas as pd import folium # 讀取csv數(shù)據(jù) data = pd.read_csv('parkings.csv', encoding='gbk') # 傳入緯度和經(jīng)度數(shù)據(jù) park_map = folium.Map(location=[data['latitude'].mean(), data['longitude'].mean()], zoom_start=10, control_scale=True,) # 實(shí)例化 folium.map.FeatureGroup 對(duì)象 incidents = folium.map.FeatureGroup() for name,row in data.iterrows(): incidents.add_child( folium.CircleMarker( # CircleMarker表示花圓 (row["latitude"], row["longitude"]), # 每個(gè)停車場(chǎng)的經(jīng)緯度坐標(biāo) radius=7, # 圓圈半徑 color='#FF1493', # 標(biāo)志的外圈顏色 fill=True, # 是否填充 fill_color='#00FF00', # 填充顏色 fill_opacity=0.4 # 填充透明度 ) ) park_map.add_child(incidents) park_map.save('park_map1.html')
效果如下:
這樣看起來(lái)有點(diǎn)亂,下面我們來(lái)統(tǒng)計(jì)一下各個(gè)局域的停車場(chǎng)數(shù)量
import pandas as pd import folium from folium import plugins 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,) 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')
效果如下:
這樣能對(duì)各個(gè)局域停車場(chǎng)的數(shù)量在地圖上進(jìn)行統(tǒng)計(jì),將圖不斷放大以后,還可以顯示每個(gè)停車場(chǎng)的具體位置,非常方便。
到此,相信大家對(duì)“如何安裝Python繪制地圖神器folium”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!