標籤:
在開來源資料庫中,對空間資料支援最好的是 PostgreSQL/PostGIS,postgresql 是開來源資料庫領域另一個著名的資料庫,其支援基本的空間資料類型,如 point、line、polygon、box、path 等,由於本文主要講解 mysql 的問題,這裡就不展開了。PostGIS 是對 PostgreSQL 的空間擴充,使 PostgreSQL 對空間資料的支援能力提升到了一個更高層次:比如對空間資料對象的運算和分析。雖然 PostgreSQL/PostGIS 對空間資料的支援比較全面,但是國內使用的並不多,使用最多的還是 MySQL,因此,我們這篇文章中主要講解 MySQL 中儲存的空間資料的利用問題。
MySQL 從 4.1 開始支援空間資料類型,可能由於曆史原因,或者很多技術人員並不瞭解 GIS,很多空間位置資料儲存並沒有使用專有的空間資料類型欄位,而是使用了兩個 float 類型儲存,分別代表經度和緯度,經緯度資料一般是來自 GPS 感應器;當然還有一些資料就直接利用了 MySQL 的空間擴充,空間資料表中的 geometry 類型儲存空間資料。那麼這兩種在 MySQL 資料庫中儲存的空間資訊怎麼利用呢?
本文結合 MapServer , OGR 和 MySQL ,對儲存於 MySQL 資料庫中的空間資料資訊進行訪問和渲染利用。
1. 伺服器端渲染地圖的必要性
那麼當我們需要將這些儲存在 MySQL 資料庫中的空間資料渲染並顯示到地圖上時,怎麼辦呢?由於一般要素(非地圖底圖)的渲染,資料量並不是很大,因此很多做法是將經緯度欄位取出,拼接成 GeoJSON 或者 KML 等空間資料交換格式,然後發送到用戶端進行渲染,用戶端可能是瀏覽器,瀏覽器的計算能力是有限的,這樣的做法有兩個瓶頸:
1. 隨著資料量的增大,網路傳輸需要的時間變長;2. 用戶端計算能力有限,如果計算量過大,會導致瀏覽器假死,造成很不好的體驗。
如果我們將渲染的任務交給伺服器端,將渲染的圖片結果傳回用戶端,那麼以上的瓶頸就可以突破,且伺服器端的計算能力可以通過增加伺服器進行擴充,理論上是無限的。
如果資料庫伺服器軟體使用 MapServer,我們可以通過 MapServer 來直接渲染 MySQL 中儲存的空間資料,MapServer 對 MySQL 資料來源的支援是由於得到 GDAL/OGR 的能力,MapServer 不能支援的資料往往通過 GDAL/OGR 來讀取並渲染。分為兩種情況:
1. 如果 MySQL 中的空間資料是儲存在 geometry 欄位中,那麼可以直接讀取;2. 如果 MySQL 中的空間資料是通過兩個欄位分別代表 經緯度的形式儲存的,那麼需要構造虛擬圖層。
2. 資料存放區形式為 geometry
MySQL 對空間資料的支援是比較直觀的,其空間資料類型直接對應於 OpenGIS 的規範,其能容納空間資料的欄位類型包括:GEOMETRY、POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON 和 GEOMETRYCOLLECTION,它們中的一些只支援儲存一個地理幾何地物(GEOMETRY,POINT,LINESTRING,POLYGON),其中 GEOMETRY 可以儲存 點、線 和 面,POINT,LINESTRING,POLYGON 只能儲存對應的地物類型,剩下的從字面上也可以理解,可以儲存多個點線面地物。
在這種儲存情況下,我們可以直接配置 mapfile 讀取,mapfile 樣本如下(部分,完整的mapfile 配置還有 map 對象,web 對象等等,可參見我前面的文章)。
LAYER NAME "mysql_spatial_layer" TYPE POLYGON STATUS DEFAULT CONNECTIONTYPE OGR CONNECTION "MySQL:dbname,user=root,password=mysql,port=3306" DATA "SELECT geom_col_name,property_col_name from table_name" LABELITEM "property_col_name" CLASS NAME "class_name" STYLE COLOR 240 240 240 OUTLINECOLOR 199 199 199 END LABEL COLOR 0 0 0 FONT sans TYPE truetype SIZE 8 POSITION AUTO PARTIALS FALSE OUTLINECOLOR 255 255 255 END ENDEND # layer
其中需要注意的是如下幾行:
CONNECTIONTYPE OGRCONNECTION "MySQL:dbname,user=root,password=mysql,port=3306"DATA "SELECT geom_col_name,property_col_name from table_name"
CONNECTIONTYPE的類型是OGR,這就是配置 MapServer 使用 OGR 提供的空間資料解析能力,CONNETION配置串連 MySQL 的參數,DATA指定 SQL 查詢語句。這樣,就可通過請求 MapServer 發布的 OGC 服務,來請求儲存於 MySQL 的空間資料。
3. 資料是儲存形式為 x,y
預設情況下,OGR 也不能將 x,y 形式儲存的座標資料渲染,針對這種形式的資料,OGR提供了 Virtual Format,其對應的解析引擎是 OGR VRT,通俗來說是通過一個 xml 設定檔,來將關聯式資料庫中的資料對應到 OGR 的空間資料結構。VRT 不僅可以用於將解析採用普通屬性欄位形式儲存空間資訊的表,還可以用於關聯資料和座標系統資訊,將多個圖層融合進一個資料來源等,詳細的資訊可以到這裡看:http://www.gdal.org/drv_vrt.html 。
針對 MySQL 中兩個普通屬性欄位儲存經緯度的資訊,我們可以建立一個 Virtual File,副檔名為 .ovf,一個執行個體如下:
<OGRVRTDataSource> <OGRVRTLayer name="vrt_layer_name"> <SrcDataSource>MYSQL:dbname,user=user_name,password=passwd,host=IP_addr,port=3306,tables=table_name</SrcDataSource> <SrcSQL>SELECT longitude_col_name, latitude_col_name, property_col_name FROM table_name</SrcSQL> <GeometryType>wkbPoint</GeometryType> <GeometryField encoding="PointFromColumns" x="longitude_col_name" y="latitude_col_name"/> </OGRVRTLayer></OGRVRTDataSource>
Virtual File 根項目通常是 OGRVRTDataSource,其子項目一般是一個或者多個圖層元素,圖層類型包括 OGRVRTLayer ,OGRVRTWarpedLayer 或者 OGRVRTUnionLayer,後兩個是在 GDAL/OGR 1.10.0 開始支援的,這裡就不展開了,同時,圖層元素下可以有哪些子配置元素,想瞭解更多的可以到這裡看: http://www.gdal.org/drv_vrt.html 。這裡我主要講解該例子中涉及的參數:
SrcDataSource 配置串連 MySQL 的串連資訊,SrcSQL 配置選取經緯度和屬性資訊的 SQL 查詢語句;
GeometryType 指定表中包含的空間資料的類型,允許的類型包括:”wkbNone”, “wkbUnknown”, “wkbPoint”, “wkbLineString”, “wkbPolygon”, “wkbMultiPoint”, “wkbMultiLineString”, “wkbMultiPolygon”, 或者 “wkbGeometryCollection”,如果不指定,預設值是 “wkbUnknown”,允許任何類型的地理幾何地物;
GeometryField 指定 x,y 座標的欄位名,encoding 允許的值包括 “WKT”, “WKB” 或者 “PointFromColumns”,規定座標的來源格式。
一個將 MySQL 普通形式儲存的空間資訊映射到 OGR 空間資料結構的 VRT 檔案就寫好了,接下來要在 mapfile 設定檔中相應的圖層中指定 VRT 檔案,樣本如下:
LAYER NAME "layer_name" STATUS DEFAULT TYPE POINT CONNECTIONTYPE OGR CONNECTION "vrt_file_name.ovf" DATA "vrt_layer_name" CLASS NAME "MyClass" STYLE SYMBOL ‘circle‘ SIZE 15 COLOR 0 255 0 END ENDEND
其中,DATA 參數指定的 vrt_layer_name 需要和 VRT 檔案中指定的 OGRVRTLayer 一致(),CONNECTION 參數指定 VRT 檔案路徑地址,注意 STYLE 中包含的 SYMBOL 值 ‘circle’ 是預先設定好的,是在 MAP 對象中設定的 SYMBOLSET 參數中指定的 symbol 檔案中預先定義的樣式,這裡為了突出重點,進行了省略。
4. 總結
本文主要介紹了在 MySQL 中儲存空間資料的兩種形式,解釋了在伺服器端渲染空間資料的好處,並結合 MapServer 講解了如何 結合 OGR 讀取並渲染儲存於 MySQL 中的空間資料。
好的,就寫到這裡,有什麼問題,可以在文章下面留言或者給我發郵件。
MapServer 之 使用 MySQL 資料