2019年4月6日 星期六

用雲端空間資料庫打造自己的地圖網頁(一)


目標:建立自己的線上地圖

  • 雲端主機:Google Cloud Platform 的 Compute Engine
  • 資料庫:PostgreSQL + 空間插件 PostGIS
  • 建立互動式地圖網頁:R + 套件 Shiny + 套件 Leaflet

用雲端空間資料庫打造自己的地圖網頁(一)
很久很久沒寫網誌了,這次來個應用到許多層面的專案。
目標:建立自己的線上地圖
應用工具:
  • 雲端主機:Google Cloud Platform 的 Compute Engine
  • 資料庫:PostgreSQL + 空間插件 PostGIS
  • 建立互動式地圖網頁:R + 套件 Shiny + 套件 Leaflet

雲端主機建立

雲端主機就是顧名思義,把要跑資料的電腦放在天上(誤)
總之就是,在服務商那邊開一台電腦,這台電腦的規格可以根據你的需求調整,如果只是在做測試,那可以用很爛的規格很便宜的價格取得,如果網站上線了大受歡迎,需要乘載很多人客亂點亂按,這時再去將主機調整成更好的規格就好了,我相信比自己跑去光華買台主機擺在家裡每天吃電還要方便許多。
這邊示範的是用 Google 雲端平台(簡稱 GCP )提供的 Compute Engine 服務,也就是讓你開主機的服務。為什麼選擇 GCP 而不是更老牌的 Amazon EC2 呢?因為基本上 GCP 的雲端服務價格會比 AWS 便宜,而且新手使用有 12 個月的免費試用期或者 300 美元的額度而且我有很多 Google 分身帳號所以免費試用期用完了就換下一個
準備好你的 Google 帳號,接下來就 Follow 這篇官方文件做吧:
https://cloud.google.com/compute/docs/quickstart-linux?hl=zh-tw
執行個體的選項可以參考以下:
instance
區域(Region)選擇你的所在地例如台灣( asia-east1-b),因為當資料跨區域傳輸的時候是會被收費的,也就是說如果你人在台灣,但把主機資料放在美國,美國傳輸資料到台灣的$$也會是一筆開銷(參考收費表)。
開機磁碟部分,本文使用Ubuntu 16.04 作業系統為例,防火牆的選項記得將允許 HTTP/HTTPS 流量都打勾。按下建立,稍等幾分鐘,很快的新主機就在遠方為你開好囉。

圖中紅框框的地方就是這台雲端主機的 IP 位址,之後做資料庫連線時就是要用這組 IP。但要注意,如果你將這台主機關機再重新開機,這個 IP 會更動,除非將這組 IP 設定為靜態 IP,不過設定為靜態 IP 後如果你關機不用,是會額外被收費的(IP 有限請節約使用的概念XD)

再來還有一件重要的事情,就是設定網路防火牆,要允許連線進入資料庫,如果沒有設定,就無法從外部操作這台雲端主機的資料庫了。
點擊主機名稱,進入主機狀態頁,點擊編輯按鈕。
enter image description here
在網路標記的欄位,新增一個 tag ,這裡叫做 postgres
enter image description here
接著如下圖所示,進入防火牆規則的服務中
enter image description here
點擊「建立防火牆規則」,輸入資訊:
firewall-rule
這時要建立兩個防火牆規則,一個選擇如上圖的「流入」,另一個選擇「流出」,其他資訊都ㄧ樣。
其中要特別注意的是來源 IP 範圍,這邊填寫 0.0.0.0/0,意味著全世界所有 IP 都可以從 tcp:5432 這個 port 進入你的主機(這差不多等同於在大街上裸奔),所以最好輸入你的電腦 IP 位置,例如我現在的 IP 是 63.235.172.162,就在後面加上 63.235.172.162/32。
再來終於要進來安裝 PostgreSQL 的重點了。在這邊可以點擊上圖籃框框中的 SSH 按鈕,進入 Terminal 開始操作這台雲端主機。

安裝 PostgreSQL 和 PostGIS 插件

首先執行以下指令,將這台主機的套件更新
sudo apt-get update
安裝 PostgreSQL 還有 PSQL client
sudo apt-get -y install postgresql postgresql-client postgresql-contrib
基本上 Ubuntu 16.04 預設的資源庫中,PostgreSQL 的版本是 9.5。
很快的就安裝完成了。
再來是進入 Postgresql 的指令工具,對資料庫做基本設定。
首先進入 root 模式
sudo -s
用 postgres 這個預設使用者名稱來使用 psql 指令,連接到 postgres 這個預設資料庫(好繞口)
sudo -u postgres psql postgres
此時就會進入 PostgreSQL 的 Command Line Tool,畫面會顯示
postgres=#
接著輸入以下指令以設定 postgres 這個使用者的密碼(這組帳密就會是登入資料庫時的帳密,務必記住)
\password postgres
輸入 \q 離開 command line tool,回到原本的 shell 之後,輸入以下指令建立一個叫做 geo-data 的新資料庫
sudo -u postgres createdb -O postgres geo-data
輸入以下指令檢查資料庫是否建立完成:
psql -h localhost -U postgres geo-data
輸入密碼後,如果成功出現下列訊息,就代表資料庫建立成功囉
psql (11.2 (Ubuntu 11.2-1.pgdg16.04+1), server 9.5.16)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

geo-data=# 
再次鍵入 \q 離開 command line tool。接著要讓這個 PostgreSQL 資料庫可以被遠端操作,這需要編輯設定系統的 pg_hba.conf 檔以及 postgresql.conf 這兩個檔案。
輸入以下指令,開始編輯 pg_hba.conf
sudo nano /etc/postgresql/9.5/main/pg_hba.conf
拉到檔案的最下面,加入這一行
host    all             all           [YOUR_IPV4_ADDRESS]/32         md5
其中 [YOUR_IPV4_ADDRESS] 要改成你現在的 IP 位址。按下 Control+x 存檔離開。接著編輯另一個檔案postgresql.conf
sudo nano /etc/postgresql/9.5/main/postgresql.conf
找到其中有一行長成這樣:
#listen_addresses = 'localhost'.
把 # 符號刪除,並且將 localhost 改成 * ,也就是變成下列這行:
listen_addresses = '*'
按下 control+x 離開並存檔,最後重新啟動 PostgreSQL 就完成資料庫遠端操作功能的開啟囉!
sudo service postgresql restart
終於把 PostgreSQL 的安裝與基本設定完成了,再來的工作是開始安裝 PostGIS 插件。
PostGIS 是讓 PostgreSQL 資料庫「認得」空間資訊的外掛,如果沒有安裝 PostGIS ,那麼資料庫裡的資料就只是一般資料,而不會擁有空間資訊的。
輸入以下指令安裝 PostGIS
sudo apt install postgis postgresql-9.5-postgis-2.3
將插件建立在剛才做出來的資料庫 geo-data
sudo -u postgres psql -c "CREATE EXTENSION postgis; CREATE EXTENSION postgis_topology;" geo-data
再次鍵入 \q 離開 command line tool,開始安裝 PostGIS 插件。
PostGIS 是讓 PostgreSQL 資料庫「認得」空間資訊的外掛,如果沒有安裝 PostGIS ,那麼資料庫裡的資料就只是一般資料,而不會擁有空間資訊的。
輸入以下指令安裝 PostGIS
sudo apt install postgis postgresql-9.5-postgis-2.3
將插件建立在剛才做出來的資料庫 geo-data
sudo -u postgres psql -c "CREATE EXTENSION postgis; CREATE EXTENSION postgis_topology;" geo-data
就這樣,今天建立的 geo-data 這個資料庫就準備好囉!
最後是強烈推薦使用 PostgreSQL 官方出的 GUI 工具 pgAdmin 來操作資料庫,絕對會比在 command line tool 裡面打指令還要舒服許多!
下載點:https://www.pgadmin.org/download/
在自己的電腦安裝好 pgAdmin4 之後,按下 add New Server,輸入連線資訊後就可以連上剛才建立好的雲端資料庫囉!
pgAdmin connection
成功進入之後,就可以看到剛才建立的資料庫,點開之後再打開 Extensions,可以看到剛才安裝的兩個插件 postgis 以及 postgis_topology。

終於~~以上落落長一大堆都是基礎建設,下一篇文章再來講講如何將空間資料存入這個資料庫中,並且輕鬆的在 R 中取得以及操作。

0 comments:

張貼留言