<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 繪制地圖神器,上手直接開大!

          共 10718字,需瀏覽 22分鐘

           ·

          2021-02-24 12:51

          大家晚上好,我是小五

          之前給大家介紹過多種Python可視化模塊,但使用他們進行地理可視化都很簡陋。

          所以想要繪制更精美的可視化地圖?想在地圖上自由的設置各種參數(shù)?想獲得靈活的交互體驗?

          今天它就來了,Python繪制地圖神器folium,上手直接開大!

          一、folium簡介和安裝

          folium 建立在 Python 生態(tài)系統(tǒng)的數(shù)據(jù)應用能力和 Leaflet.js 庫的映射能力之上,在Python中操作數(shù)據(jù),然后通過 folium 在 Leaflet 地圖中可視化。

          folium 相比較于國內(nèi)百度的 pyecharts 靈活性更強,能夠自定義繪制區(qū)域,并且展現(xiàn)形式更加多樣化。[1]

          1. folium的簡介

          • Folium是建立在 Python 生態(tài)系統(tǒng)的數(shù)據(jù)整理 Datawrangling 能力和 Leaflet.js 庫的映射能力之上的開源庫。用 Python 處理數(shù)據(jù),然后用 Folium 將它在 Leaflet 地圖上進行可視化。Folium能夠?qū)⑼ㄟ^ Python 處理后的數(shù)據(jù)輕松地在交互式的 Leaflet 地圖上進行可視化展示。它不單單可以在地圖上展示數(shù)據(jù)的分布圖,還可以使用 Vincent/Vega 在地圖上加以標記。
          • 這個開源庫中有許多來自 OpenStreetMap、MapQuest Open、MapQuestOpen Aerial、Mapbox和Stamen 的內(nèi)建地圖元件,而且支持使用 Mapbox 或 Cloudmade 的 API 密鑰來定制個性化的地圖元件。Folium支持 GeoJSON 和 TopoJSON 兩種文件格式的疊加,也可以將數(shù)據(jù)連接到這兩種文件格式的疊加層,最后可使用 color-brewer 配色方案創(chuàng)建分布圖。
          • Folium可以讓你用 Python 強大生態(tài)系統(tǒng)來處理數(shù)據(jù),然后用 Leaflet 地圖來展示。Folium內(nèi)置一些來自 OpenStreetMap、MapQuest Open、MapQuest Open Aerial、Mapbox和Stamen 的地圖元件(tilesets),并且支持用 Mapbox 或者 Cloudmade API keys 來自定義地圖元件。Folium支持 GeoJSON 和 TopJSON 疊加(overlays),綁定數(shù)據(jù)來創(chuàng)造一個分級統(tǒng)計圖(Choropleth map)。但是,F(xiàn)olium庫繪制熱點圖的時候,需要聯(lián)網(wǎng)才可顯示。

          2. 安裝folium

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

          ??這里直接使用了國內(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)

          幾個重要的參數(shù):

          • location:經(jīng)緯度,list 或者 tuple 格式,順序為 latitude, longitude
          • zoom_start:縮放值,默認為 10,值越大比例尺越小,地圖放大級別越大
          • control_scale:Bool型,控制是否在地圖上添加比例尺,默認為 False 即不添加
          • tiles:顯示樣式,默認 "OpenStreetMap",也就是開啟街道顯示
          • crs:地理坐標參考系統(tǒng),默認為 "EPSG3857"

          1. 各級別地圖

          世界地圖

          import folium

          print(folium.__version__)

          # define the world map
          world_map = folium.Map()
          # save world map
          world_map.save('test_01.html')

          結(jié)果如下:

          當前folium版本:0.11.0

          國家地圖

          import folium
          # define the national map
          national_map = folium.Map(location=[35.3100.6], zoom_start=4)
          # save national map
          national_map.save('test_02.html')

          結(jié)果如下:

          市級地圖

          其實改變地圖顯示也就是改變顯示的經(jīng)緯度和縮放比例,省級、市級、縣級用法相似,這里舉一個市級的例子為例,如北京市:

          import folium
          # define the national map
          city_map = folium.Map(location=[39.93116.40], zoom_start=10)
          # save national map
          city_map.save('test_03.html')

          2. 在地圖上標記

          普通標記

          添加普通標記用 Marker,可以選擇標記的圖案。

          import folium

          bj_map = folium.Map(location=[39.93115.40], zoom_start=12, tiles='Stamen Terrain')

          folium.Marker(
              location=[39.95115.33],
              popup='Mt. Hood Meadows',
              icon=folium.Icon(icon='cloud')
          ).add_to(bj_map)

          folium.Marker(
              location=[39.96115.32],
              popup='Timberline Lodge',
              icon=folium.Icon(color='green')
          ).add_to(bj_map)

          folium.Marker(
              location=[39.93115.34],
              popup='Some Other Location',
              icon=folium.Icon(color='red', icon='info-sign')    # 標記顏色  圖標
          ).add_to(bj_map)

          bj_map.save('test_04.html')

          結(jié)果如下:

          圓形標記

          添加圓形標記用 Circle 以及 CircleMarker

          import folium

          bj_map = folium.Map(location=[39.93116.40], zoom_start=12, tiles='Stamen Toner')

          folium.Circle(
              radius=200,
              location=(39.92116.43),
              popup='The Waterfront',
              color='#00FFFF',   # 顏色
              fill=False,        # 填充
          ).add_to(bj_map)

          folium.CircleMarker(
              location=(39.93116.38),
              radius=50,   # 圓的半徑
              popup='Laurelhurst Park',
              color='#FF1493',
              fill=True,
              fill_color='#FFD700'
          ).add_to(bj_map)

          bj_map.save('test_05.html')

          結(jié)果如下:

          動態(tài)放置標記

          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é)果如下:

          更多詳細使用可以參考官方文檔:http://python-visualization.github.io/folium/quickstart.html[2]

          三、實戰(zhàn)案例

          以將停車場地理位置數(shù)據(jù)可視化在地圖上示例,熟悉 folium 地圖可視化的使用。

          1. 獲取經(jīng)緯度數(shù)據(jù)

          停車場地理位置數(shù)據(jù)來源于網(wǎng)絡,數(shù)據(jù)真實可靠,下面先利用 Python 爬蟲獲取數(shù)據(jù)

          #數(shù)據(jù)來源: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(1318):
              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)
              # 重新設置編碼
              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 個停車場地理位置數(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,)
          # 實例化 folium.map.FeatureGroup 對象
          incidents = folium.map.FeatureGroup()
          for name,row in data.iterrows():
              incidents.add_child(
                  folium.CircleMarker(            # CircleMarker表示花圓
                      (row["latitude"], row["longitude"]),   # 每個停車場的經(jīng)緯度坐標
                      radius=7,                   # 圓圈半徑
                      color='#FF1493',            # 標志的外圈顏色
                      fill=True,                  # 是否填充
                      fill_color='#00FF00',       # 填充顏色
                      fill_opacity=0.4            # 填充透明度
                  )
              )

          park_map.add_child(incidents)
          park_map.save('park_map1.html')

          效果如下:

          這樣看起來有點亂,下面我們來統(tǒ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')

          效果如下:

          這樣能對各個局域停車場的數(shù)量在地圖上進行統(tǒng)計,將圖不斷放大以后,還可以顯示每個停車場的具體位置,非常方便。

          我們的文章到此就結(jié)束啦,如果你喜歡今天的Python 實戰(zhàn)教程,請持續(xù)關注Python實用寶典。

          有任何問題,可以在公眾號后臺回復:加群,回答相應紅字驗證信息,進入互助群詢問。

          原創(chuàng)不易,希望你能在下面點個贊和在看支持我繼續(xù)創(chuàng)作,謝謝!

          點擊下方閱讀原文可獲得更好的閱讀體驗

          Python實用寶典 (pythondict.com)
          不只是一個寶典
          歡迎關注公眾號:Python實用寶典


          瀏覽 38
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产高清视频色 | 西西444 | 麻豆三级片在线 | 在线无码视频免费观看 | 美女网站操逼视频国产 |