1. 程式人生 > 其它 >GeoJSON資料格式解析

GeoJSON資料格式解析

GeoJSON資料格式

https://www.bilibili.com/video/BV1VK4y1M78n?spm_id_from=333.337.search-card.all.click

Mapbox和PostGis裡面常用的資料格式是GeoJSON

TopoJSON壓縮率比GeoJSON更高

TopoJSON 是 GeoJSON 的擴充套件,增加了拓撲邏輯的編碼。

TopoJSON 檔案中的幾何圖形不是獨立地表示,而是由共享的線段(稱為弧線)拼接而成。TopoJSON 消除了冗餘,提供了比 GeoJSON 更緊湊的幾何表示;典型的 TopoJSON 檔案比 GeoJSON 等價檔案小 80%。此外,TopoJSON 還為使用拓撲的應用提供了便利,如拓撲保護形狀簡化、自動地圖著色和製圖。

GeoJSON手冊

網址:https://geojson.org/

GeoJSON 是一種用於編碼各種地理資料結構的格式。

// Feature:表示這是一個要素
{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [125.6, 10.1]
  },
  "properties": {
    "name": "Dinagat Islands"
  }
}

GeoJSON 支援以下幾何型別:PointLineString(線)、 Polygon(面)、MultiPointMultiLineString

MultiPolygon。具有附加屬性的幾何物件是Feature物件。特徵集包含在FeatureCollection物件中。

  • MultiPolygon:這個面覆蓋著好多的小島
  • FeatureCollection(要素集合):多個Feature放在一起,一個要素集合也是一個標準的Geojson格式
  • 單獨一個點,一個線,一個面也是一個標準的Geojson格式

GeoJSON格式規範說明

https://www.oschina.net/translate/geojson-spec

1. GeoJSON特徵集合

// 前後臺開發使用的時候FeatureCollection只會寸一種型別,要麼是點,要麼是線,要麼是面
{ "type": "FeatureCollection",			// type標識這一段是什麼東西:Feature的集合
  "features": [
    { "type": "Feature",				// 一個Feature要素是包含圖形和屬性在一起的
     	// geometry裡面也是一個物件,物件裡面的type就是點線面、多點、多線、多面六種
      "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},	// geometry:圖形
      "properties": {"prop0": "value0"}								// properties:屬性
      },
      // 一個Feature裡type和geometry是必須的,properties不是必須的
    { "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的網站:http://geojson.io/#map=2/50.5/50.3

// 一個geometry可以被geojson.io進行解析,所以一個geomtry也可以被稱為genjson
{
        "type": "LineString",
        "coordinates": [
          [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
          ]
        }

!![image-20220409103908484](D:\10. OSM\02. tippecanoe筆記\06.GeoJSON資料格式解析.assets\image-20220409103908484.png)

// 一個Feature也被認為是一個標準的geojson
{ "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
        }
      }

!![image-20220409104011427](D:\10. OSM\02. tippecanoe筆記\06.GeoJSON資料格式解析.assets\image-20220409104011427.png)

// 標準的FeatureCollection格式
{
  "type": "FeatureCollection",
  "features": [
    { "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
        }
      }]
}

![image-20220409104030567](D:\10. OSM\02. tippecanoe筆記\06.GeoJSON資料格式解析.assets\image-20220409104030567.png)

2. GeoJSON物件

GeoJSON總是由一個單獨的物件組成。這個物件(指的是下面的GeoJSON物件)表示幾何、特徵或者特徵集合。

  • GeoJSON物件可能有任何數目成員(名/值對)。
  • GeoJSON物件必須由一個名字為"type"的成員。這個成員的值是由GeoJSON物件的型別所確定的字串。
  • type成員的值必須是下面之一:"Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", "GeometryCollection", "Feature", 或者 "FeatureCollection"。這兒type成員值必須如這兒所示。
    • Mapbox GL不支援Geometry Collection
  • GeoJSON物件可能有一個可選的"crs"成員,它的值必須是一個座標參考系統的物件(見3.座標參考系統物件)。
  • GeoJSON物件可能有一個"bbox"成員,它的值必須是邊界框陣列(見4.邊界框)。

2.1 位置

2.1.1 面

對型別"Polygon"來說,"coordinates"成員必須是一個線性環座標陣列的陣列。對擁有多個環的的面來說,第一個環必須是外部環,其他的必須是內部環或者孔。

第一個面是大面,如果有第二個面就認為這第二個面是一個洞

附錄A.集合例子

下面例子中的每一個都表示一個完整的GeoJSON物件。注意JSON物件裡的結尾的空白字元沒有意義。例子裡所用的空白符有助於說明這個資料結構,不過不是必需的。

// 點座標是按照x,y順序的(投影座標的東向、北向,地理座標的長度、高度):
// coordinates是一個一維陣列,第一個是x,第二個是y
{ "type": "Point", "coordinates": [100.0, 0.0] }

// 線的座標是位置陣列,二維陣列,兩點確定一條直線
{ "type": "LineString",
  "coordinates": [ [100.0, 0.0], [101.0, 1.0] ]
  }

// 面的座標是線性環座標陣列的陣列。這個陣列的第一個元素表示的是外部環。其他後續的元素表示的內部環(或者孔)。
// 沒有孔的:
// 二維陣列:四邊形用5個點表示,最後一個點閉合回初始位置
{ "type": "Polygon",
  "coordinates": [
    [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
    ]
 }

// 有孔的:
// 一個洞的面是三維陣列
{ "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] ]
    ]
 }

// 多面的座標是面座標陣列的陣列
{ "type": "MultiPolygon",
  "coordinates": [
      // 無孔面
    [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
      // 有孔面
    [[[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]]]
    ]
  }

![image-20220409104047274](D:\10. OSM\02. tippecanoe筆記\06.GeoJSON資料格式解析.assets\image-20220409104047274.png)

![image-20220409104102163](D:\10. OSM\02. tippecanoe筆記\06.GeoJSON資料格式解析.assets\image-20220409104102163.png)

![image-20220409104114976](D:\10. OSM\02. tippecanoe筆記\06.GeoJSON資料格式解析.assets\image-20220409104114976.png)