GEOJSON資料格式解析

myskies發表於2021-12-15

最近想通過echarts來實現一些自定義的地圖,接觸到了一種地圖的資料格式GeoJSONGeo是地理座標的意思,然後JSON是指json型別的資料格式。

我們可以通過阿里雲DataV來快速的獲取到一份縣級以上的地圖。而如果想繪製縣級以的地圖,則需要自己想一點辦法。

比如自己去geojson站點去繪製。繪製完成後將最終得到一份型別為JSON的地圖檔案,格式確切的說為GeoJSON

而本文在於解釋GeoJSON這種資料格式中各項的具體含義。

除了echarts外,其它的地圖元件也基本是基於GeoJSON的,比如:Leaflet

準備

在正式理解GeoJSON之前,我們先下載一下成型的檔案,以當前筆者所研究的尚義縣為例,我們在阿里雲上下載一個成型檔案。

然後使用sublime等工具開啟這個檔案並進行格式化。最終發現
一個基本的GeoJSON檔案有個主要的關鍵字:type:

{
    "type": "FeatureCollection",
    "features": [
    {
        "type": "Feature",
        "properties":
        {
            "adcode": 130725,
            "name": "尚義縣",
            "center": [113.977713, 41.080091],
            "centroid": [114.147607, 41.123316],
            "childrenNum": 0,
            "level": "district",
            "acroutes": [100000, 130000, 130700],
            "parent":
            {
                "adcode": 130700
            }
        },
        "geometry":
        {
            "type": "MultiPolygon",
            "coordinates": [
                [
                    [
                        [114.35286, 40.73159],
                        [114.356768, 40.73224]
                    ]
                ]
            ]
        }
    }]
}
注意:以上檔案省略了大部分基礎資料。

type

根級的type分別為FeatureCollectionFeature,分別代表特徵值集合特徵值

查詢rfc7946白皮書可得:當typeFeatureCollection時,其必然還擁有一個features值,該值的型別是一個JSON陣列,每一個資料的型別均是一個Feature

白皮書同時還給出了Feature特徵值的的說明:

  • 擁有一個geometry屬性,該屬性的值的型別是object, 作用是對其圖型的進行描述(定義),如果當前特徵值還沒有確認,則給其賦值為null。
  • 擁有一個properties屬性。該屬性的值的型別是object或是null。它定義了地圖的相關屬性。
  • 如果該特徵值需要規定一個識別符號(ID),那麼這個識別符號應該使用字串或是數字的形式。

閱讀完白皮書我們大概瞭解到:一個地圖是由一個或多個Feature組成的,每個Feature會定義一些屬性(properties)以及地圖的邊界資料(geometry)。

Geometry

Geometry譯為幾何圖形,它是整個地圖的核心,其中的資料決定了地圖長什麼樣子。

幾何形狀的種類有PositionPointMultiPointLineStringMultiLineStringPolygonMultiPolygonGeometryCollection。分別代表:位置,單點多點, ,多條線,多邊形,多個多邊型幾何形狀集合

該種類由type關鍵字來規定,比如我們下載到的地圖檔案的type值為MultiPolygon:

        "geometry":
        {
            "type": "MultiPolygon",

表示該幾何形狀由多個多邊形組成。

而具體的地圖的資料則被定義在coordinates中,當type不同時coordinates的型別也不同。

解讀

通過學習白皮書,結合我們下載的地圖檔案,我們大概瞭解到:

  1. 一個地圖檔案由一個或多個特徵值Feature組成,如果我們願,則可以為每個特徵值起個名字。
  2. 每個特定值下都可以規定一個幾何形狀。
  3. 當一個幾何形狀不足以滿足要求時,還可以將幾何形狀的型別宣告為GeometryCollection以定義多個幾何形狀。
  4. 需要為每個幾何形狀都指定好型別,該型別為:點、線、多邊形等。

有了上述的資料格式,其它的地圖軟體便可以根據讀取後的資料繪製地圖了。

中空地圖

一般的地圖都可以通過ali提供的多邊形選擇來獲取,但中空的地圖就不行了。
這時候則需要我們先選中外圈,再選擇內圈,然後下兩個檔案,最後接拼成這的樣子。

{
    "type": "Polygon",
    "coordinates": [
        [[1,2], [3, 4]],
        [[5,6], [7, 8]]
    ]
}

coordinates中的第一項是外圈,第二項則是內圈.
一定要注意的是,外圈應該是
中空圖形的type是Polygon,第一個座標陣列是外圈座標按逆時針排序,第二個座標陣列是內環按順時針排序;

參考文件(工具)

http://www.thingjs.com/guide/cn/tutorial_city_builder/Data_description/Online_tools.html
https://datav.aliyun.com/portal/school/atlas/area_generator
https://geojson.org/
http://geojson.io/
rfc7946白皮書

相關文章