PyQGIS開發 -- 離線地圖

地圖是地理信息應用的基礎,凡是一切與位置有關的信息都離不開地圖。我們生活中常見的谷歌、百度、高德等公司為我們提供了便利的地圖服務,極大便利了我們生活的方方面面。

在地理信息應用中,地圖往往是基礎底圖,起到……的作用。常見的地圖服務有OpenStreetMap、百度地圖、必應地圖、谷歌地圖、天地圖等等。

在GIS應用系統中,每次都通過網路連接獲取這些地圖服務無疑是耗時的,這就產生了將這些地圖數據下載、離線存儲的需求。

本文將分別通過QGIS軟體操作和PyQGIS開發示例兩個方面來闡述如何使用QGIS下載OSM(Open Street Map)提供的地圖數據,並離線載入的方法。掌握了PyQGIS載入離線地圖數據的技巧,開發者可以應用到自己開發的Python插件或者獨立應用程序中。由於QGIS的Python API介面與C++ API介面基本一致,因此,QGIS的C++二次開發者也同樣適用。

OSM地圖數據下載

OSM具有豐富的全球開源地理信息數據,提供在線/離線的柵格、矢量數據服務。

由於網路的原因,在QGIS中載入OSM在線數據並不總是能夠成功,或者地圖載入會非常緩慢。筆者推薦直接用瀏覽器打開 www.openstreetmap.org 網站上,下載離線數據,導出為「.osm」文件。而後文講到的使用QGIS軟體來直接載入OSM在線數據並下載的方法僅供能夠訪問國外網的朋友參考。

在QGIS中,可以使用菜單欄「Vector -> OpenStreetMap -> Download Data」來下載OSM地圖數據。

該功能提供了從「地圖畫布」、「圖層」以及「手動範圍」三種方式下載數據。

這裡,以上三種下載方式我們都不講解,它們已經很直觀了。

我們介紹一款叫「OSMDownloader」的插件,它提供了一種使用滑鼠拖拽選擇數據下載範圍的方式。

「OSMDownloader」顧名思義,它提供了下載OSM地圖數據的功能。

除了「OSMDownloader」插件以外,我們還需要下載一款「OpenLayers Plugin」插件,它提供了諸如OSM、谷歌、必應等在線地圖服務載入功能。

在QGIS菜單欄依次選擇」Plugins -> Manage and Install Plugins「,在彈出的插件管理窗口中搜索」OSM「找到並安裝「OSMDownloader」這款插件。

同樣,搜索並下載「OpenLayers Plugin」插件。(由於筆者已經安裝了該插件,顧截圖中顯示「Reinstall Plugin」,若沒有安裝過,則該處按鈕會顯示「Install Plugin」)

插件安裝好以後,「OSMDownloader」在QGIS軟體的工具欄上是下面這個樣子的:

而「OpenLayers Plugin」會出現在QGIS的「Web」菜單欄中:

在QGIS中,使用」OSMDownloader「插件下載OSM在線地圖數據的操作如下:

1、打開QGIS軟體,依次選擇菜單欄中的「Web -> OpenLayers plugin -> OpenStreetMap」,載入OSM地圖,並縮放到我們感興趣的位置。

2、點擊「OSMDownloader」插件按鈕,在QGIS地圖窗口中拖動滑鼠選擇要下載的地圖數據區域。

3、保存下載文件到本地路徑。

離線地圖數據載入

現在,我們下載好了OSM提供的地圖數據,如何載入呢?

很簡單,直接選中下載的」.osm「文件,拖動到QGIS地圖窗口中,就能打開了。

彈出圖層選擇窗口,點擊「Select All」,並確定。

所有圖層就會在QGIS地圖畫布中展示出來了,如下圖:

這時候,你還可以保存這個地圖工程為」.qgs「的本地文件,下次只需要用QGIS載入這個」.qgs「地圖工程就會自動打開OSM離線地圖數據了。

打開的時候,用QGIS菜單欄「Project -> Open」即可。

需要注意的是,QGIS工程文件只是一個XML文本,只存儲了數據文件的路徑,並沒有存儲數據文件本身,因此,刪除數據文件之後,這個工程文件就會出錯了。拷貝工程文件必須連帶數據文件也要拷貝,並且要將工程文件設置為相對路徑保存(這個不是本節要講的內容,不展開了)。

PyQGIS示例

操作並不複雜,接下來我們使用PyQGIS來完成離線地圖數據載入的操作。

同樣,我們用載入QGIS工程文件的方式來達到打開離線地圖數據的目的,代碼如下:

from PyQt4.QtCore import *nndir = "/Users/Jacory/" # 這個路徑改成你的工程文件路徑nfileName = "OfflineMap.qgs" # 同樣,修改工程文件名稱nnf = QFileInfo(dir + fileName) np = QgsProject.instance()np.readPath(dir)np.read(f)n

---------------------

OK,本節內容就是這樣,如有錯誤,請批評指正,謝謝。

推薦閱讀:

玩點好玩的--知乎全部話題關係可視化(Docker+Flask+Bootstrap+echarts+uWSGI+Nginx)
windows下如何安裝libxml2?
用Python玩GTA 5—使用OpenCV讀取遊戲面面

TAG:Python | GIS地理信息系统 | 地图 |