**HOW TO CREATE A MAP BY PYTHON?** ![](https://i.imgur.com/0z4IaS2.jpg) *by GM MUMU* --- # Python with folium --- **下載 *Anaconda 3*** **搜尋Anaconda** **下載安裝** **若沒有python也要載一下(version3.5/3.6)** ---- > 英文補給站: python 是指蟒蛇 ,而Anaconda是指森蚺[color=#c4db60] --- **英文造句時間:** **~~Do you want to see my anaconda?~~** --- # 2.安裝 ==*folium*== 套件 --- **開啟 Anaconda Prompt 來安裝 ==*folium*==** **語法如下:** ```python= pip3 install folium ``` **安裝好後就將Prompt關掉** --- # 3.來畫圖囉 --- * 開啟 *juypter notebook* ---- **小黑窗不能關掉喔!!!** ---- * 按下左上角的new -> python3 * 執行方法: ==shift + enter==(重要!!!) * 單行註解 : #abc * 多行註解 : '''abc''' * 在新的頁面中線將untitled 按一下: 可以改名 ---- ```python= import folium fmap = folium.Map(location=[22.998642,120.219831], zoom_start=16) fmap ``` >座標地點可以自己找 >測量系館大概是[22.998642,120.219831][color=#480575] ---- **也可以將製作好的地圖存成 *html* 直接用瀏覽器開啟** ```python= fmap.save('map.html')#檔名可自己改,目前是map ``` --- # 4.加入Marker囉!! ---- 什麼是 Marker ? 地圖上的標記(ex.google map 小紅點) ---- 地圖上面只有地名很無單調 我們來加一下marker八!!! ---- Marker可以標註點 我們也可以使用 *popout* 來顯示文字 ---- ```python= fmap.add_child(folium.Marker (location = [22.998642,120.219831], popout = '成大測量系')) ``` **打完之後就 *shift + enter* 看一下吧~** ---- **應該會長類似這樣** ![](https://i.imgur.com/WCVMjRH.jpg) --- # 5.自訂Marker color ---- 但是,當我們想要加入更多的點怎麼辦呢? 可以透過不同的變數來存取喔!!! like this ```python= m1 = fmap.add_child(folium.Marker # m1 = 變數名稱 (location = [22.998642,120.219831], popout = '成大測量系'), color = 'green') # 透過加入color來區分color間的不同 ``` ---- **color 怎麼改阿?** * 方法一 --- ```python= color = 'green' #使用內建支援色彩 #色彩支援如下(真的不多) [‘red’,‘blue’,‘green’,‘purple’, ‘orange’,‘darkred’,’lightred’, ‘beige’, ‘darkblue’, ‘darkgreen’, ‘cadetblue’, ‘darkpurple’, ‘white’, ‘pink’,‘lightblue’, ‘lightgreen’, ‘gray’, ‘black’, ‘lightgray’] ``` ---- * 方法二 --- ```python= #使用色碼表查詢,ex:#FFFF77 #輸入16進位色碼 color = '#9999FF' ``` [**色碼表**](https://www.toodoo.com/db/color.html) --- # 6.自訂 Marker icon ---- * 方法一 --- **使用內建icon** ```python= m3 = folium.Marker(location=[35.715092, 139.796666], popup='Asakusa Temple', icon=folium.Icon(icon='info-sign' ,color ='beige')) #info-sign 為內建支援icon ``` ---- 注意: 一個 *Marker()* 裡面只能有一個 *color* 不能icon裡面一個 *color* ,外面再設立一個!!! ```python= m3 = folium.Marker(location=[35.715092, 139.796666], popup='Asakusa Temple', icon=folium.Icon(icon='info-sign' ,color ='beige'), color = 'blue') #這行是錯的 ``` ---- * 方法二 **使用外部icon** **使用 font awesome** **1.搜尋 font awesome** **2.版本相容問題,請使用舊版version 4** **舊版連結在官網最下方(oid version 4.7),或[點我](https://fontawesome.com/v4.7.0/)** ---- **點選 icons -> all icons ** **選擇你想要的icons** **以 *paper - plane* 為例([點我](https://fontawesome.com/v4.7.0/icon/paper-plane))** **進入頁面後應該會看到** ==fa-paper-plane== ---- **這邊的 *fa* 是 *prefix(前綴修飾)(html 語法)*** ***paper-plane* 則是 *icon style*** ```python= m2 = folium.Marker(location=[35.707595, 139.795530], popup='Hotel', icon=folium.Icon(icon='paper - plane',#Icon類型 prefix='fa')) # 使用Font Awesome Icons ``` ---- **你應該會看到** ![](https://i.imgur.com/o444qsi.jpg) ---- **當然這邊的 *marker* 也是可以改顏色** ```python= m2 = folium.Marker(location=[35.707595, 139.795530], popup='Hotel', icon=folium.Icon(icon='paper - plane',#Icon類型 color = 'green', prefix='fa')) # 使用Font Awesome Icons ``` ---- **變綠色囉!!!** ![](https://i.imgur.com/pIvG3Ly.jpg) --- # 7.Circle & Polyline ---- **地圖上化緣** ![](https://i.imgur.com/AKIb7AV.jpg) ---- **地圖上畫圓** **使用 *Circle( )*** ```python= center_pos = [35.709635, 139.810851] fmap.add_child(folium.Circle(location=center_pos, color='red', # Circle 顏色 radius=500, # Circle 寬度 fill=True, # 填滿中間區域 fill_opacity=0.7 # 設定透明度:1是完全不透 )) ``` ---- **多邊形是由很多線和點組成** **先給出數個點座標,形成陣列** **接著使用 *Polyline( )* 連線** ---- ```python= points = [[35.709635, 139.810851], [35.707595, 139.795530], [35.715092, 139.796666]] fmap.add_child(folium.PolyLine(locations=points,#座標 weight=8, # 線條寬度 color = '#9999FF')) # 顏色 ``` ---- **成圖:** ![](https://i.imgur.com/9SZYQ6E.jpg) --- # 8.迷你地圖 ---- **我們可以藉由 *folium plugin* 來引入迷你地圖** **回到最初 *import folium* 下方打上** ```python= from folium.plugins import MiniMap ``` **接著指定變數並加入地圖** ```python= minimap = MiniMap() fmap.add_child(child = minimap) ``` --- # 9.Minimap Control ---- * **摺疊(收起來)** * **尺寸** * **縮放比例** * **換底圖** ---- **摺疊(收起來)** ```python= minimap = MiniMap(toggle_display=True) ``` **尺寸** ```python= minimap = MiniMap(width=400, height=100) ``` **縮放比例** ```python= minimap = MiniMap(zoom_level_offset=-8) ``` **換底圖** ```python= minimap = MiniMap(tile_layer='Stamen Toner') ``` ---- **提供一些可以換的底圖** **[看網站](https://deparkes.co.uk/2016/06/10/folium-map-tiles/)** * statemanwatercolor * cartodbpositron * cartodbdark_matter * stamenterrain --- ## 10.Measurementcontrol ## ---- **回到最初繼續 *import*** ```python= from folium.plugins import MeasureControl ``` **將量測功能加入地圖** ```python= fmap.add_child(MeasureControl())#量測地圖功能加入 ``` ---- **出現這個就成功了,直接用吧!!!** ![](https://i.imgur.com/z2BmLof.jpg) ---- **可以量直線距離,面積 量完之後還可以 *center on it* 超棒的八八~** --- # 11.點點不見了!? ---- ***請大家先將自己的地圖縮小 直到看到世界地圖*** ***然後環球一圈八*** ***觀察一下自己設的點還在不在*** ---- ***若想要在環遊世界後還要保存自己的 *Marker**** ***就加上這句八:*** ```python= world_copy_jump=True ``` ***加在那裡ㄋ?*** ```python= fmap = folium.Map( location=[35.709635, 139.810851], zoom_start = 15, world_copy_jump=True,)# 建立地圖與設定位置 ``` ---- ***加完之後在環遊世界一次看看吧~*** ***folium 地圖的基礎應用就到這邊囉!*** ***下一章是 *heatmap**** --- # 12.heatmap ---- ***這邊比較難所以就不一一講解*** ***基本概念就是地圖資料 + 時間 = 會動的地圖*** ---- ***因為沒有原始資料 所以使用亂數資料*** ---- ```python= import folium # 匯入 folium 套件 import numpy as np #python 的數學庫 from folium.plugins import HeatMap fmap = folium.Map(location=[35.712326, 139.804037], zoom_start=12) # 建立隨機資料 data = (np.random.normal(size=(100, 3)) * 0.02 * np.array([[1, 1, 1]]) + np.array([[35.712326, 139.804037, 1]])).tolist() #normal() 是指正態分布,裡面吃三個參數(loc(float),scale(float),size(int 或者整数元组)) #相關資料可以看以下連結 fmap.add_child(HeatMap(data=data)) ``` [np.normal](https://blog.csdn.net/huanhuan_Coder/article/details/80762208) ---- **大家可以 *shift + enter* 一下** **會發現出現heatmap 了,但是不會動** **Why????** ---- ***想知道的話請留言告訴小編 小編收到留言後會 inbox 給您喔*** ---- **請 import HeatMapWIthTime** ```python= import numpy as np from folium.plugins import HeatMapWithTime center_pos = [35.712326, 139.804037] # 使用 numpy 建立初始資料 initial_data = (np.random.normal(size=(200, 2)) * np.array([[0.07, 0.07]]) + np.array([center_pos])) # 建立連續資料 data = [initial_data.tolist()] for i in range(80): data.append((data[i] + np.random.normal(size=(200, 2)) * 0.122).tolist()) fmap = folium.Map(center_pos, zoom_start=11) fmap.add_child(HeatMapWithTime(data)) # 顯示連續熱度圖 ``` ---- **What do you see now???** **可以調整 fps, 控制循環, 正反播放, 快進退** --- # 想學更多 ---- **以下網站可以幫助你** **前提是看得懂英文** 1. [Stack Overflow](https://stackoverflow.com) 2. [folium map tutorial](http://nbviewer.jupyter.org/github/python-visualization/folium/tree/master/examples/) 3. [Cheng-Shiang Li's Blog](http://blog.yeshuanova.com) **本次教學內容幾乎都在以上連結可找到,感謝他們** ###### tags: `python` ###### tags: `folium` --- # End **edited by MUMU,2018/12/24**