1.簡介
GeoJSON是一種對各種地理數據結構進行編碼的格式。GeoJSON對象可以表示幾何、特征或者特征集合。GeoJSON支持下面幾何類型:點、線、面、多點、多線、多面和幾何集合。GeoJSON里的特征包含一個幾何對象和其他屬性,特征集合表示一系列特征。
一個完整的GeoJSON數據結構總是一個(JSON術語里的)對象。在GeoJSON里,對象由名/值對--也稱作成員的集合組成。對每個成員來說,名字總是字符串。成員的值要么是字符串、數字、對象、數組,要么是下面文本常量中的一個:"true","false"和"null"。數組是由值是上面所說的元素組成。
1.1.舉例
GeoJSON特征集合:
{ "type":"FeatureCollection", "features":[ { "type":"Feature", "geometry":{ "type":"Point", "coordinates":[ 102,0.5 ] }, "properties":{ "prop0":"value0" } }, { "type":"Feature", "geometry":{ "type":"LineString", "coordinates":[ [102,0], [103,1], [104,0], [105,1] ] }, "properties":{ "prop0":"value0", "prop1":0 } }, { "type":"Feature", "geometry":{ "type":"Polygon", "coordinates":[ [ [100,0], [101,0], [101,1], [100,1], [100,0] ] ] }, "properties":{ "prop0":"value0", "prop1":{ "this":"that" } } } ] }
1.2.定義
JavaScript對象表示和術語對象、名字、值、數組和數字在IETF RFC 4627 即http://www.ietf.org/rfc/rfc4627.txt里定義。
這篇文檔里的關鍵字“必須“,”不允許“,”需要“,”應當“,”應當不“,”應該“,”不應該“,”推薦的“,”也許“和”可選的“在IETF RFC 2119, 即http://www.ietf.org/rfc/rfc2119.txt里解釋。
2.GeoJSON對象
GeoJSON總是由一個單獨的對象組成。這個對象(指的是下面的GeoJSON對象)表示幾何、特征或者特征集合。
GeoJSON對象可能有任何數目成員(名/值對)。
GeoJSON對象必須由一個名字為"type"的成員。這個成員的值是由GeoJSON對象的類型所確定的字符串。
type成員的值必須是下面之一:"Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", "GeometryCollection", "Feature", 或者 "FeatureCollection"。這兒type成員值必須如這兒所示。
GeoJSON對象可能有一個可選的"crs"成員,它的值必須是一個坐標參考系統的對象(見3.坐標參考系統對象)。
GeoJSON對象可能有一個"bbox"成員,它的值必須是邊界框數組(見4.邊界框)。
2.1幾何對象
幾何是一種GeoJSON對象,這時type成員的值是下面字符串之一:"Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", 或者"GeometryCollection"。
除了“GeometryCollection”外的其他任何類型的GeoJSON幾何對象必須由一個名字為"coordinates"的成員。coordinates成員的值總是數組。這個數組里的元素的結構由幾何類型來確定。
2.1.1.位置
位置是基本的幾何結構。幾何對象的"coordinates"成員由一個位置(這兒是幾何點)、位置數組(線或者幾何多點),位置數組的數組(面、多線)或者位置的多維數組(多面)組成。
位置由數字數組表示。必須至少兩個元素,可以有更多元素。元素的順序必須遵從x,y,z順序(投影坐標參考系統中坐標的東向、北向、高度或者地理坐標參考系統中的坐標長度、緯度、高度)。任何數目的其他元素是允許的---其他元素的說明和意義超出了這篇規格說明的范圍。
位置和幾何的例子在附錄A.幾何例子里呈現。
2.1.2.點
對類型"Point"來說,“coordinates"成員必須是一個單獨的位置。
2.1.3.多點
對類型"MultiPoint"來說,"coordinates"成員必須是位置數組。
2.1.4.線
對類型"LineString"來說,“coordinates"成員必須是兩個或者多個位置的數組。
線性環市具有4個或者更多位置的封閉的線。第一個和最后一個位置是相等的(它們表示相同的的點)。雖然線性環沒有鮮明地作為GeoJSON幾何類型,不過在面幾何類型定義里有提到它。
2.1.5.多線
對類型“MultiLineString"來說,"coordinates"成員必須是一個線坐標數組的數組。
2.1.6.面
對類型"Polygon"來說,"coordinates"成員必須是一個線性環坐標數組的數組。對擁有多個環的的面來說,第一個環必須是外部環,其他的必須是內部環或者孔。
2.1.7.多面
對類型"MultiPlygon"來說,"coordinates"成員必須是面坐標數組的數組。
2.1.8.幾何集合
類型為"GeometryCollection"的GeoJSON對象是一個集合對象,它表示幾何對象的集合。
幾何集合必須有一個名字為"geometries"的成員。與"geometries"相對應的值是一個數組。這個數組中的每個元素都是一個GeoJSON幾何對象。
2.2.特征對象
類型為"Feature"的GeoJSON對象是特征對象。
特征對象必須由一個名字為"geometry"的成員,這個幾何成員的值是上面定義的幾何對象或者JSON的null值。
特征對戲那個必須有一個名字為“properties"的成員,這個屬性成員的值是一個對象(任何JSON對象或者JSON的null值)。
如果特征是常用的標識符,那么這個標識符應當包含名字為“id”的特征對象成員。
2.3.特征集合對象
類型為"FeatureCollection"的GeoJSON對象是特征集合對象。
類型為"FeatureCollection"的對象必須由一個名字為"features"的成員。與“features"相對應的值是一個數組。這個數組中的每個元素都是上面定義的特征對象。
3.坐標參考系統對象
GeoJSON對象的坐標參考系統(CRS)是由它的"crs"成員(指的是下面的CRS對象)來確定的。如果對象沒有crs成員,那么它的父對象或者祖父對象的crs成員可能被獲取作為它的crs。如果這樣還沒有獲得crs成員,那么默認的CRS將應用到GeoJSON對象。
默認的CRS是地理坐標參考系統,使用的是WGS84數據,長度和高度的單位是十進制標示。
名字為"crs"成員的值必須是JSON對象(指的是下面的CRS對象)或者JSON的null。如果CRS的值為null,那么就假設沒有CRS了。
crs成員應當位於(特征集合、特征、幾何的順序的)層級結構里GeoJSON對象的最頂級,而且在自對象或者孫子對象里不應該重復或者覆蓋。
非空的CRS對象有兩個強制擁有的對象:"type"和"properties"。type成員的值必須是字符串,這個字符串說明了CRS對象的類型。屬性成員的值必須是對象。CRS應不能更改坐標順序(見2.1.1.位置)。
3.1. 名字CRS
CRS對象可以通過名字來表明坐標參考系統。在這種情況下,它的"type"成員的值必須是字符串"name"。它的"properties"成員的值必須是包含"name"成員的對象。這個"name"成員的值必須是標識坐標參考系統的字符串。比如“urn:ogc:def:crs:OGC:1.3:CRS84"的OGC CRS的URN應當優先於舊的標識符如"EPSG:4326"得到選用:
{ "crs":{ "type":"name", "properties":{ "name":"urn:ogc:def:crs:OGC:1.3:CRS84" } } }
3.2. 連接CRS
CRS對象也可以連接到互聯網上的CRS參數。在這種情況下,它的"type"成員的值必須是字符串"link",它的"properties"成員的值必須是一個連接對象(見3.2.1.連接對象) 。
3.2.1.連接對象
連接對象由一個必需的成員:"href",和一個可選的成員:"type"。
必需的"href"成員的值必須是解引用的URI(統一資源標識)。
可選的"type"成員的值必須是字符串,而且這個字符串暗示了所提供的URI里用來表示CRS參數的格式。建議值是:"proj4","ogcwkt",esriwkt",不過可以使用其他值:
{ "crs":{ "type":"link", "properties":{ "href":"http://example.com/crs/42", "type":"proj4" } } }
相對連接常常可以作為輔助文件里的CRS的直接處理器:
{ "crs":{ "type":"link", "properties":{ "href":"data.crs", "type":"ogcwkt" } } }
4.邊界框
為了包含幾何、特征或者特征集合的坐標范圍信息,GeoJSON對象可能有一個名字為"bbox的成員。bbox成員的值必須是2*n數組,這兒n是所包含幾何對象的維數,並且所有坐標軸的最低值后面跟着最高者值。bbox的坐標軸的順序遵循幾何坐標軸的順序。除此之外,bbox的坐標參考系統假設匹配它所在GeoJSON對象的坐標參考系統。
特征對象上的bbox成員的例子:
{ "type":"Feature", "bbox":[-180,-90,180,90], "geometry":{ "type":"Polygon", "coordinates":[ [ [-180,10], [20,90], [180,-5], [-30,-90] ] ] } }
特征集合對象bbox成員的例子:
{ "type":"FeatureCollection", "bbox":[100,0,105,1], "features":[ ] }
附錄A.集合例子
下面例子中的每一個都表示一個完整的GeoJSON對象。注意JSON對象里的結尾的空白字符沒有意義。例子里所用的空白符有助於說明這個數據結構,不過不是必需的。
點
點坐標是按照x,y順序的(投影坐標的東向、北向,地理坐標的長度、高度):
{ "type": "Point", "coordinates": [100.0, 0.0] }
線
線的坐標是位置數組(見2.1.1.位置):
{ "type":"LineString", "coordinates":[ [100,0], [101,1] ] }
面
面的坐標是線性環坐標數組的數組。這個數組的第一個元素表示的是外部環。其他后續的元素表示的內部環(或者孔)。
沒有孔的:
{ "type":"Polygon", "coordinates":[ [ [100,0], [101,0], [101,1], [100,1], [100,0] ] ] }
有孔的:
{ "type":"Polygon", "coordinates":[ [ [100,0], [101,0], [101,1], [100,1], [100,0] ], [ [100.2,0.2], [100.8,0.2], [100.8,0.8], [100.2,0.8], [100.2,0.2] ] ] }
多點
多點的坐標是位置數組:
{ "type": "MultiPoint", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ] }
多線
多線的坐標是線坐標數組的數組:
{
"type":"MultiLineString",
"coordinates":[
[
[100,0],
[101,1]
],
[
[102,2],
[103,3]
]
]
}
多面
多面的坐標是面坐標數組的數組:
{
"type":"MultiPolygon",
"coordinates":[
[
[
[102,2],
[103,2],
[103,3],
[102,3],
[102,2]
]
],
[
[
[100,0],
[101,0],
[101,1],
[100,1],
[100,0]
],
[
[100.2,0.2],
[100.8,0.2],
[100.8,0.8],
[100.2,0.8],
[100.2,0.2]
]
]
]
}
幾何集合
幾何集合的幾何數組里的每個元素都是上面所描述的幾何對象之一:
{
"type":"GeometryCollection",
"geometries":[
{
"type":"Point",
"coordinates":[100,0]
},
{
"type":"LineString",
"coordinates":[
[101,0],
[102,1]
]
}
]
}
本文非原創,為了方便自己理解和記憶,特意將原來的博客重新整理發布在自己的園子內。這里提供原文鏈接【https://www.oschina.net/translate/geojson-spec#id8】