地圖的數據採集處理、服務搭建發佈、前端交互構建,要全講下來其實挺複雜,這裏僅僅簡單介紹一下,並羅列一些資料,如果有興趣,可以按圖索驥,深入瞭解。
1.OGC
OGC即爲Open Geospatial Consortium,開放地理信息聯盟,由530多家企業、政府機構、研究組織、大學組成的國際性協會,致力於提供地理信息行業軟件和數據及服務的標準化工作,推動地理空間位置信息和服務的公平性、可查性、訪問性、交互性、複用性。
簡而言之,就是GIS行業,從數據採集製作,到地圖位置服務發佈,都要遵循OGC定義或公佈的規範。
地理信息數據供應商,國外的如TomTom、HERE,國內的如四維圖新、高德,數據規格書,一整就大幾百頁,數據格式也千奇百怪,但其實數據分區與編碼規範都是類似的,都遵循OCG對地理空間數據的定義,核心是,幾何數據與屬性數據分開存儲,以唯一ID做關聯,數據分比例尺層級與圖幅存儲。
地圖與位置服務提供商,谷歌、OSM(開源)、高德、騰訊、百度、天地圖等,地圖頁面打開,有細微差別,但長得都挺像。WEB API服務,入參與出參,也沒有太大差異。原因不外乎,對於規範的遵守。
OGC的規範非常多,但很多規範都是現實中沒什麼用的水規範,用的最多應該是WMS。
官方網址:https://www.opengeospatial.org/
2.WMS
web map service,網絡地圖服務。
OGC最重要也最常用的規範就是WMS規範。WMS事無鉅細的爲網絡地圖的數據格式、圖例樣式、地圖發佈、交互設計等等方面定義了一系列的規範細則。原則上,所有地圖數據生產與地圖服務提供企業,都要遵循它。
落在地圖發佈與交互上,WMS=WMTS+WFS。
WMTS就是,web map tile service,網絡地圖瓦片服務,地圖數據量很大,無法直接傳到前端顯示,會先在後端渲染生成柵格圖片,將圖片傳到前端,用以顯示。
瓦片的意思是,後端渲染生成的圖片,是一塊一塊傳到前端的,就跟蓋房子的瓦片一塊一塊壘到房頂一樣。WMTS服務發佈的是柵格圖片,柵格內容無法修改。
WFS就是web feature service,網絡要素服務,這個服務是矢量的。地圖要素即爲feature,feature是一個可被操作的對象。通過WFS服務,可以對數據(幾何+屬性)進行增刪改查等操作。
簡而言之,WMS服務,其中WMTS,是用來看的,沒有辦法對數據進行操作,數據操作要通過WFS服務。
規範下載地址:http://www.opengeospatial.org/standards/wms
3.瓦片地圖
推動滾輪,修改比例尺,可以將地圖放大縮小。因爲電腦屏幕大小是一定的,所以比例尺越大,顯示的地理範圍就越小,而地圖內容就越詳細,比例尺越小,顯示的地理範圍就越大,而地圖內容就越概要。
瓦片地圖就像金字塔一樣,每層由一個個小方塊平鋪而成,以一個小方塊爲例,當地圖被放大的時候,這個小方塊所佔的實際地理空間被分成2×2的4個小方塊,新生成的小方塊像素寬度和長度跟原來的小方塊一樣,原來一個小方塊的內容由4個小方塊來展示,展示空間大了,就變得詳實了,但是電腦屏幕是一定的,之前加載多少小方塊,現在還加載多少。
這就是瓦片地圖的核心,數據傳輸量是不變的,隨着比例尺的放大縮小,展示的實際地理空間和地圖內容會發生變化。
下面兩張圖,一個是3級比例尺下的內容,一個是13級比例尺下的內容,小方塊的像素大小是一樣的,但後者地圖內容要比前者詳細得多,而實際地理空間要小得多。
更多瓦片地圖的介紹,可參見兩篇寫的很清晰的博客:
https://segmentfault.com/a/1190000011276788?utm_source=tag-newest
https://blog.csdn.net/qq_35732147/article/details/81476542
4.座標系
我們用(x,y)表示二維平面上的一個點,用(x,y,z)表示三維空間中的一個點,這就是數學座標系。
同樣爲了抽象表示地球上某個點,還有點與點之間的關係,我們也需要爲地球找一個座標系,這就是大地座標系。
世界上大概有幾千個座標系,因爲地球不是圓的,每個地方最擬合地球表面的橢球肯定也不是同一個,所以各地的座標系也不一樣。
中國最早採用的是蘇聯的克拉索夫斯基橢球,原點在蘇聯的普爾科沃的北京54座標系(1954年規定的)。後來依然採用克拉索夫斯基橢球,但將原點設在了陝西省涇陽縣永樂鎮,因爲這套座標系在西安確定,1980年頒佈,所以叫做西安80座標系。再後來國家爲了發展空間技術,啓用了國家大地2000座標系,這也是北斗系統的座標系。
世界範圍比較常用的座標系是WGS84座標系,不搞高精定位的話,WGS84座標系和CGCS2000座標系差不了多少,一個地球參考極指向曆元1984年,一個指向曆元2000年,它倆的差別主要是地殼運動產生的,地殼運動每年2釐米偏移的話,16年也就三米多。
谷歌地圖和OSM地圖,都是WGS84座標系。
天地圖是CGCS2000座標系。
高德、騰訊是GCJ02座標系,GCJ02座標系是在WGS84基礎上加密而成的。
百度是BD09座標系,是在GCJ02上再次加密而成的。
更多座標系相關的內容,可參見:http://epsg.io/
EPSG是歐洲石油調查組的縮寫,經濟推進科技進步,收納世界全部座標系的組織是開採石油的。
WGS84(CGCS2000)、GCJ02、BD09之間的轉換參見:
https://github.com/wandergis/coordtransform
5.投影
地球是個球,電腦屏幕和手機屏幕都是一個面,如何在平面上顯示一個球?
把球拍平了,這就是投影,webGIS最常用的地圖投影就是墨卡託投影,墨卡託投影認爲地球是一個圓球,把它投影到一個方形上,其投影算法簡單高效,適用於平面顯示。
更多地圖投影的信息可參看:
https://desktop.arcgis.com/zh-cn/arcmap/10.3/guide-books/map-projections/about-map-projections.htm
6.WKT與WKB
WKT(Well-known text),是一種文本標記語言,用於表示矢量幾何對象、空間參照系統及空間參照系統之間的轉換。它的二進制表示方式,亦即WKB(well-known binary)則在傳輸和數據庫中存儲相同的信息。該格式由開放地理空間聯盟(OGC)制定。
簡而言之,WKT和WKB,就是要素的幾何信息的文本表示。
最常見的要素幾何就是點、線、面。
以下是點線面的WKT文本。
POINT(6 10),一個點。
LINESTRING(3 4,10 50,20 25),一條線。
POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),一個帶孔洞的面。
OCG規範與定義下載路徑:https://www.opengeospatial.org/docs/is/
7.geojson
GeoJSON是一種用於編碼各種地理數據結構的格式。GeoJSON對象可以表示幾何圖形,要素或要素集合。GeoJSON支持以下幾何類型:點,線串,多邊形,多點,多線串,多多邊形和幾何集合。GeoJSON中的要素包含幾何對象和其他屬性,要素集合表示要素列表。
簡而言之,geojson就是表示地理數據的json,經常用於webGIS工程的前後端數據傳遞上。
一個簡單的geojson串如下,它能表達一個要素集合。
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
"properties": {"prop0": "value0"}
},
{ "type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
]
},
"properties": {
"prop0": "value0",
"prop1": 0.0
}
},
{ "type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
[100.0, 1.0], [100.0, 0.0] ]
]
},
"properties": {
"prop0": "value0",
"prop1": {"this": "that"}
}
}
]
}
geojson介紹官網:https://geojson.org/,geojson定義在2016年有過大更新。
8.geotool
geotool是OGC提供的一套用於GIS數據處理與服務的JAVA開源庫,GDAL是它的python版。
geotool功能強大,涵蓋了GIS領域所有底層算法和服務框架,它能進行空間運算、圖像處理、地圖發佈等。最常用的geotool套件是jts,jts主要運用DE-9IM模型,進行矢量數據的空間運算。
因爲geotool涵蓋太多,jts涉及很多GIS算法,此處就不展開贅述了,有需要的可以去官網瞻仰學習。
geotool的官網是:https://www.geotools.org/
GDAL的官網是:https://gdal.org/
9.geoserver
因爲geotool發佈WMS服務難度高(地圖渲染、瓦片裁切等都要從最底層開始寫,還會遇到JVM、JAI性能問題),故geoserver應運而生。
geoserver底層用的也是java+geotool,它構建了一個jetty的web工程。
有了geoserver,我們不用寫代碼,啓動一個頁面工具,就能發佈地圖了。
geoserver官網是:http://geoserver.org/
10.openlayer
openlayer是一個專爲webGIS開發提供的JavaScript庫包,用以實現標準格式發佈的地圖數據訪問。openlayer是完全依照WMS標準來的,與geoserver有很好的兼容性。
除了openlayer外,各圖商也提供基於自身地圖的前端腳本,如果僅僅是簡單的地圖展示與操作,可以使用谷歌、高德、騰訊、百度等地圖的JavaScript API。
除了openlayer外,還有比較火的開源JavaScript庫包,就是leaflet了,相對來說,leaflet更輕量,使用羣體更廣,且官方網站提供全部的交互源碼的下載,它的開發文檔更易讀,對非專業人士更友好,上手更快。
但leaflet並沒有完全依照WMS規範,不支持單瓦片加載(多瓦片,面註記會冗餘),座標系轉換等功能,且繪製功能較弱。
不過實話實說,openlayer比leaflet複雜,且使用人羣沒有leaflet多,參考資料較少,故如果對GIS和OGC規範,包括座標系定義、投影定義、GML(帶地理空間信息的XML語言)數據格式定義、地圖瓦片原理、圖層概念、製圖風格等,不太瞭解的話,建議使用leaflet,因爲openlayer的交互都是基於wms服務來的。
且leaflet維護的人多,各種插件也很多,做熱力圖和軌跡圖等展示用的demo更多更炫。
openlayer官方網站:https://openlayers.org
leaflet官方網站:https://leafletjs.com
11.postgresql
常用的開源數據庫非常多,但對於webGIS來說,postgresql應該是最好的選擇。
首先,geoserver與postgresql兼容,其次postgresql有很多很有用的插件,例如空間計算插件postgis、基於postgis的拓撲套件postgis_topology、路徑規劃插件pgrouting、文本模糊匹配fuzzystrmatch、tiger英文地址編碼postgis_tiger_geocoder、地址標準化插件address_standardizer、時空檢索插件pg-trajectory等。
依託於這麼豐富的擴展性,除了webGIS,postgresql還可以應用在時空數據處理、路徑規劃、地理編碼上,有可能數據庫插件自帶的成熟算法,要比自己寫的好很多。
postgresql官方網站:https://www.postgresql.org/
postgis官方網站:http://www.postgis.org/
12.總結
背景知識講了很多,但其實還是很少,都是稍稍提了一些,沒有詳細展開。
我們需要知道有OGC,OGC的WMS規範,地圖發佈都是依據這個規範來的,遵循地圖瓦片的原理。不過各圖商在發佈的時候,瓦片尺寸、起始座標、地圖風格,會有細微不同。
爲什麼要發佈瓦片地圖?就是因爲內容多、數據量大,不發佈成柵格瓦片,根本沒有辦法傳到前端並渲染。
因爲要發佈地圖,所以我們需要了解geotool和geoserver、發佈完成後,要有展示,所以需要知道openlayer前端腳本庫,數據是要交互的,所以要了解WKT和WKB、geojson。
數據存在哪裏?postgresql。
這是一個全流程,且是需要進行知識擴展的全流程。
要想對一個專業、一項技術,有深入瞭解,單單看簡介是不夠的。
買一本書,張康聰老師的《地理信息系統導論》,從頭到尾看一遍,看懂50%即可,把原理了解一下。
webGIS沒什麼太好的書,這個主要靠實踐,遇到問題,不斷的去查找資料就行,總有一天會達到閉環。
在互聯網行業,GIS是很小衆的一個方向,主要用於行業交叉應用,它有一定的專業性,但在實踐中,更多的是交叉學科的融合。多學點總歸沒壞處,但是否接觸,或者是深耕,還要看個人的職業規劃。