基於地理數據的肌理分析圖——QGIS 用例
原問題:如何做高大上的城市肌理分析圖?
文長,圖多,敬請注意。
在上面引用的問題中,我給出的回答事實上是偏題的,僅僅給出了一個獲得肌理的方式,而沒有觸及到關鍵部分。趁有機會,來填一下坑,畫一個建築高度分析圖。
但是,在此仍然需要強調我在原回答中的一個觀點——這類圖的核心在於地理數據。如果有數據,這無非是在 GIS 軟體中,將屬性表內的相關欄位映射到不同色彩上;沒有數據,做這樣的圖只能採取近乎手工的方式。而不巧的是,在中國大陸,地理信息數據集並不易得;而 OpenStreetMap(本文示例的數據來源)這個「維基式」的地圖網站,在中國大陸的資料目前仍相當欠缺。考慮到地理數據的可得性問題,本文對於國內讀者的價值或許相對較低,而對於身處國外的讀者——尤其是在紐約這樣的有著大量公開數據的城市——的參考意義更大一些。
本文使用的工具是 Quantum GIS (QGIS)。當然,使用 QGIS 絕非製作此類肌理分析圖的唯一手段,用 ArcGIS、Rhino + Grasshopper + ELK 或是 MapBox,都能做。
以下是內容大綱:
- 工具
- 準備
- 數據獲取
- 數據處理
- 表達
- 出圖
* * * * * *
工具
我選擇用 QGIS,主要有兩個原因:
- QGIS 有 Mac 版。我個人更傾向於在 OS X 里做各種事情,除了要打《老滾 5》的時候。
- QGIS 的圖更好看。圖面效果極度依賴於樣式設置(QGIS 的默認圖形樣式也很醜),而 QGIS 的樣式設置能做到的事情,ArcGIS 應該也都能做到,但 QGIS 導的圖是帶抗鋸齒的。當然,在 ArcGIS 里也能通過將出圖解析度設置到 600 PPI 然後再縮小來實現抗鋸齒,但 QGIS 在工作區里的圖形也是抗鋸齒的。
除卻上面相當個人化的兩點因素,QGIS 還有不少特色,包括而不限於免費、開源、體積相對較小、支持多種數據格式。QGIS 和 ArcGIS 的對比,可參考此問題:QGIS 和 ArcGIS 的區別和優缺點有哪些呢? - GIS(地理信息系統)
雖然功能無法與售價高昂的 ArcGIS 相提並論,但 QGIS 的使用者數目也不少,Stack Exchange 的 GIS 子站 上也有很多關於 QGIS 的問答,我在使用 QGIS 過程中遇到的不少問題,都是在上面找到解決方案的。
準備
做出題圖,理應不需要太熟悉 QGIS 的使用方法,因為我也沒接觸 QGIS 多長時間,在後文中,我也會給出相對詳細的步驟。不過,若有興趣,多了解一下界面總是好的。QGIS 官網提供了一份很詳盡的入門教程,雖說未有中文版,但讀起來應當不會算很難。我也用搜索引擎找到了一些用中文書寫的 QGIS 使用手冊,若有需要,可以找找。
QGIS 提供中文界面。不過,之前為了便於在 Stack Exchange 和官方文檔中找答案,我將界面語言設為了英文。在後面,我也會以英文界面為基礎,來說明功能的位置。
在作圖的過程中用到了一些插件。它們分別是:
- OpenLayers Plugin,用來將 OpenStreetMap (OSM) 底圖載入到工作區,方便尋找要目標位置,也就是本例的曼哈頓。
- OSM place search,可以輸入地名,搜索位置——類似於地圖網站和谷歌地球。當然,不安裝這個插件也沒問題。
- QuickOSM,用以處理 OSM 數據包。如果直接使用 QGIS 導入 OSM 數據,會有一些屬性被放到 other_tags 欄位中——譬如本例中關鍵的 height.
QGIS 的插件可以在 菜單欄→Plugins→Manage and Install Plugins 中進行安裝。在搜索欄中鍵入插件的名稱,就能找到上述插件。
圖 1
本例中使用到的工具條如下,最好在 菜單欄→View→Toolbars 中設置為與 圖 2 相同,以免產生找不到工具的麻煩:
圖2
數據獲取
前文提到,本例使用的數據來自 OpenStreetMap。導出 OpenStreetMap 最常用的方式,應該就是到其網站上直接使用導出功能。用這個途徑獲取數據,範圍比較直觀,也可以免去使用上文提到的 OpenLayer 和 OSM place search 兩個插件。
圖 3
但是,我試圖使用這個方法導出數據的時候失敗了(可能是數據量太大,下載時出現了問題)。雖然說 OSM 在網頁上也提供了其他備選導出途徑,不過 QGIS 本身也附帶 OSM 數據下載功能,所以,我就改為使用該工具來進行下載。
首先,使用 菜單欄→Web→OpenLayer Plugin→ OpenStreetMap,將 OSM 底圖添加到 QGIS 工作區中。視乎網速,載入的速度可能會有差異。然後,通過 菜單欄→Panel→OSM place search 打開地點搜索麵板,輸入 Manhattan。等下方列表出現後,點按 Zoom 來縮放到所選目標區域。
圖 4
可以發現,地圖的形狀並不符合實際情況。這是因為當前所選的參考坐標系 (CRS) 是 WGS 84,一個以經緯度為單位的坐標系統。因為要將地球這個橢球體展開成正交的經緯網格,工作區域中的圖形發生了形變。要解決這個問題,可以點擊上圖中界面右下角「Render」旁邊寫著 EPSG:4326 (OTF) 的區域,然後在彈出的窗口中勾選 Enable 『on the fly』 CRS transformation(啟用動態參考坐標系變換),並在 Filter 中搜索 WGS 84 / Pseudo Mercator,選中,確認,之後的圖形形狀,就是「正常」的了。關於不同投影方式和 CRS 的內容,並非本文的重點,此處暫且略過。
圖 4 中,右側窗口是 QGIS 自帶的 OSM 數據下載界面,開啟位置在 菜單欄→Vector→OpenStreetMap→Download Data。可以向上圖的預選設置那樣,下載工作區視圖範圍的數據,也可以手動輸入經緯度界定出的矩形框範圍。範圍越大,需要下載的數據量越多(OSM 導出是會導出最詳細層級的數據的),下載需要一段時間。
數據處理
通過上一步,我們獲得了一個約莫 50 M 大小的 OSM 數據包,裡面包含了道路、興趣點 (POI)、用地、建築之類的信息。然而,製作本例的肌理分析圖,僅僅需要其中部分數據。
此時,需要使用 QuickOSM 這個插件。在 菜單欄→Vector→QuickOSM 中打開插件,在 OSM File 一欄中打開剛才下載好的文件,僅勾選 Multipolygon,選擇 All tags. 點擊 Open 後,是漫長的等待(我下載的 OSM 文件包含了將近五萬個多邊形面)。本來,有一個速度比使用 QuickOSM 快得多的導入方法,但經試驗後,發現這個方法存在 bug,會導致一些要素的屬性缺失——這個錯誤還是比較致命的。我也翻查了 Stack Exchange,發現這個 bug 目前無解,只好使用 QuickOSM 插件了。
載入成功後,要素會自動添加到工作區域中。這時候,就可以在圖層面板中右鍵單擊剛才導入進來的圖層,先保存 (Save as…)。
圖 5
Multipolygon 除了包含建築外輪廓,也包含其他面狀要素——譬如 圖 5 中那些奇怪的多邊形塊。而這些要素,顯然並非本例需要的。要去除這些塊狀,可以利用表達式選取工具(圖 5 中高亮的圖標)。在窗口中輸入以下表達式——
"building" is not Nulln
然後點窗口右下角的 Select, 就可以選取所有屬於建築的面狀要素。不同的數據集,其欄位很可能是不同的(當然,OSM 數據的格式相當固定,`building` 欄位表示的就是建築類型,若是 Null,也就是非建築了),在處理數據的時候,需要查看屬性表(圖 5 高亮圖標右邊的工具,或者右鍵單擊圖層,Open Attribute Table)根據情況來寫表達式。
默認情況下,選中的要素會變成亮黃色。此時,再右鍵單擊圖層面板中的當前圖層(我這裡取名為 Polygons),再執行一次另存為操作。記得在這一次操作中,勾選 Save only selected features。
表達
雖然紐約的 OSM 數據相對完善,但查看屬性表之後,會發現仍然有部分建築的高度信息 (height) 為 Null——也就是說,該要素缺失高度信息。同時,屬性表中 `height` 欄位的類型是 Text (String),也就是字元串。但是,如果想將數據映射到顏色漸變上,數據類型必須是整數 (Integer) 或者實數 (Real)。解決方法有兩個
第一種方法是對數據本身進行轉換:
- 打開圖層的屬性表(方法見上文),按屬性表窗格中最左側的黃色鉛筆圖標,開啟編輯模式;
- 按右數第二個圖標 (New Column),新建一個欄位,名為 `BldgHeight`,類型 (Type) 選擇 Real,Width 填 5,Precision 填 2(Width 指整個數據總位數,而 Precision 為小數位數。按需選擇);
- 按最右邊的算盤 (?!) 圖標,打開欄位計算器 (Field Calculator)。如 圖 6,勾選 Update existing field, 選擇剛才創建的 `BldgHeight`,並在填寫表達式的文本框中填入下述表達式,確定。case when "height" is Null then 0 else "height" end
- 最後保存。
第二種方法,是直接使用原來的數據,但是在設置圖層樣式時使用表達式來進行轉換。設置樣式的方法很簡單,在圖層面板中右鍵單擊建築圖層,然後點選 Properties。在出現的窗口中選擇 Style,就可以看到如下界面。在最頂端的下拉菜單中選擇 Graduated,以使用按數據選取漸變顏色這種表達類型,然後在 Column 中選擇需要使用的數據——如果在上面使用了「方法一」,那麼在這裡就直接選擇 BldgHeight;如果不打算動原始數據,那麼就點擊右邊的 epsilon 圖標,填入這個表達式:
case when "height" is Null then 0 else toreal("height") endn
圖 6
在初始狀態下,這個窗口的分類列表中是沒有任何項目的。在 Mode 的分類菜單中選取一種分類法——譬如圖中的自然間斷法——並且填寫分類數量,然後點按「Classify」按鈕,就能進行分類。當然,也可以自己進行手動分類 (Add Class)。
最後按 Apply,就能在工作區域中看到效果了。此時,可能會發現每個色塊都是帶描邊的——而在這個例子中,描邊的效果並不好。要取消掉描邊,只需要點按 圖 6 窗口中碩大的「Change」按鈕,在彈出來的窗口中,選中 Fill 裡面的 Simple Fill,最後更改描邊樣式 (Border Style) 即可。具體操作摸索一下就能搞懂,懶得截圖了。
出圖
出圖前,不妨改一改底圖的底色。通過 菜單欄→Project→Project Properties 打開文檔選項,在 General 一項中,就可以看到底色設置了。
將圖做出來了,還得導圖。QGIS 提供了類似 AutoCAD 中布局的功能 (Composer). 在 菜單欄→Project→Composer Manager 中,可以對地圖布局進行增加、刪除等管理。
新建一個 Composer。在出現的窗口左側,很容易就能找到「Add new map」這個圖標,戳一下,就能在畫布上繪製矩形地圖框了——類似於 AutoCAD 的視口。而在右手邊的 Composition 窗格,是關於文檔本身的信息設置——譬如,紙張大小,導出圖形的解析度,是否以點陣圖方式導出 PDF(如果打算獲得矢量文稿,在 AI 中進一步修改,就不要勾選了),等等;而 Item Properties 窗格,則是當前選中的對象自身的特性,譬如地圖的比例、比例尺 / 指北針這些對象的樣式等等。功能不複雜,自己玩一玩,很快就能弄懂怎麼用了。
後記
算上下載 OSM 文件和等待 QuickOSM 載入文件的時間,這張圖做起來其實大概只需要三四十分鐘。如果網和硬體夠好,估計用更少時間就能做出來了。然而,這篇教程 (?) 卻磕磕碰碰地寫了大概有四五小時。
雖然這篇文章選用的工具是 QGIS,但用 ArcGIS 也能舉一反三地去做,畢竟這兩個軟體的內在邏輯也比較相似。或許用 ArcGIS 會在數據獲取、轉換方面遇到一些本文沒有提到的麻煩,但如果已經有一定的 ArcGIS 使用經驗,大概也能通過查詢文檔和 Stack Exchange 之類的方法來解決吧。Grasshopper + ELK 方面,相關教程應該也不少了。
因為我也僅僅是個 QGIS 入門用戶,對軟體不熟,上述流程或許有不少繞彎的地方。如果讀者有更便捷的方法,在評論中指出,那就最好不過了。
感謝閱讀。
推薦閱讀:
※城市規劃中,綠地和商業中心或居住區距離較遠合理嗎?
※有哪些城市設計領域的著名書籍、論文?
※能否分析一下北京的植物分布與種植?
※城市規劃專業,如何加強規劃設計的能力?
※武漢到底有什麼文化?武漢可能發展什麼文化?