簡介
Geojson是一個很重要的數(shù)據(jù)格式,結(jié)構(gòu)清晰,表達(dá)簡潔,是用于滿足空間數(shù)據(jù)展示。如今,各大地圖服務(wù)商的jssdk都已經(jīng)支持geojson的數(shù)據(jù)格式,例如高德等,更不用說阿里的L7地理數(shù)據(jù)可視化引擎,可見這種數(shù)據(jù)格式的重要性。
與ESRI的shapefile相比更加小巧簡單,但是表現(xiàn)的數(shù)據(jù)內(nèi)容卻是一樣的,我覺得GeoJson大有取代shapefile的勢頭。與還不是很成熟的topojson相比,geojson已經(jīng)兼容很多前端后段的工具,有很多腳本插件。如下:
- awesome-geojson 最好的Geojson開源項(xiàng)目集合
- geojson-js-utils 空間數(shù)據(jù)簡單處理js實(shí)現(xiàn)
- geojson-python-utils 空間數(shù)據(jù)簡單處理python實(shí)現(xiàn)
舉個栗子,抗擊非典的全國疫情各省份分布圖,可以被稱之為專題地圖,geojson則被廣泛應(yīng)用?到各種實(shí)時(shí)報(bào)告頁面當(dāng)中。?
結(jié)構(gòu)說明
點(diǎn)的數(shù)據(jù)格式
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [125.6, 10.1]
},
"properties": {
"name": "Dinagat Islands"
}
}
type指的是數(shù)據(jù)類型,它是一個feature。它包含幾何要素和屬性。幾何要素包含要素的類型和坐標(biāo)。屬性可以包含各種數(shù)據(jù)類型。
線的數(shù)據(jù)格式
{
"type": "LineString",
"coordinates": [ [100.0, 0.0], [101.0, 1.0] ]
}
線狀數(shù)據(jù)由兩個以上的點(diǎn)組合而成,在坐標(biāo)的外面多包上一層中括號,表示json中的數(shù)組。
面的數(shù)據(jù)格式
{
"type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],
[ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
]
}
由于面狀數(shù)據(jù)可以為鏤空多邊形,可以支持一個以上的多邊形,所以在線狀數(shù)據(jù)的基礎(chǔ)上多加一層中括號。
要素組合的數(shù)據(jù)格式
{ "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"}
}
}
]
}
不同的數(shù)據(jù)類型間可以包成一個FeatureCollection,最外層有個type來表示類型,而features指向各個feature數(shù)組。有人肯定會疑惑shp中有proj的屬性,geojson中可以用crs和bbox來表示投影參數(shù)和邊界范圍,詳情參考。
案例
這里分享一個小案例。
網(wǎng)友問我,獲取大批量線段的起點(diǎn)和終點(diǎn)。
我的第一反應(yīng)就是并不是用arcpy等api,這方法也可行,但是并不是最簡潔的方法。我的解決方法是最直接的:
- 通過qgis將shapefile文件轉(zhuǎn)換成geojson
- 用python內(nèi)置庫json去解析獲取數(shù)據(jù)
這樣相對來說,雖然多了一個數(shù)據(jù)轉(zhuǎn)換的過程,但是結(jié)合本章內(nèi)容,geojson是文本,結(jié)構(gòu)簡潔,方便解析。數(shù)據(jù)可以很容易獲取且替換。這個小實(shí)驗(yàn)作為課余作業(yè)。json的解析大概是10行代碼左右,熟悉python的高手可能5行代碼就搞定,比arcpy大大節(jié)省代碼。