前言

GeoJSON(地理 JSON)是一种开放的标准数据格式,用于表示地理信息和地理特征的地理数据。它基于 JSON(JavaScript Object Notation)格式,旨在用于描述地理和空间信息,例如地图数据、地理特征、地理坐标等。GeoJSON 通常用于 Web 地图应用、地理信息系统(GIS)、地理空间数据的存储和交换,以及其他与地理位置相关的应用。

GeoJSON 的主要特点包括:

  • 地理特征:GeoJSON 允许表示各种地理特征,如点(Point)、线(LineString)、多边形(Polygon)、多点(MultiPoint)、多线(MultiLineString)、多边形集合(MultiPolygon)、几何集合(GeometryCollection)、特征对象(Feature)、以及特征集合(FeatureCollection)等。这使得它适用于各种地理数据的表示。

  • 地理坐标:GeoJSON 使用经度和纬度坐标来表示地理位置。这些坐标通常使用 WGS 84 坐标系,这是一种广泛使用的地理坐标系。在国际上,每个坐标系统都会被分配一个 EPSG 代码,EPSG:4326 就是 WGS84 的代码。

  • 属性信息:GeoJSON 允许为地理特征添加属性信息。这些属性信息通常以键-值对的形式包含在 GeoJSON 对象中,使用户能够附加各种属性数据。

  • 简洁性:GeoJSON 使用 JSON 格式,这使得它易于阅读、编写和解析。JSON 是一种文本格式,易于与各种编程语言兼容。

GeoJSON 通常用于 Web 地图应用中,例如 高德OpenLayersMapbox,用于将地理数据显示在地图上。它也被用于地理信息系统,用于地理数据的导入、导出和存储。许多地理信息数据提供者和地理数据 API 也支持 GeoJSON 格式,使其成为广泛应用的标准。

GeoJSON 对象

GeoJSON 对象分为三种:几何对象、特征对象、特征集合对象

几何对象

GeoJSON 支持以下几何类型:PointMultiPointLineStringMultiLineStringPolygon,和MultiPolygon

除了 GeometryCollection 外的其他任何类型的 GeoJSON 几何对象必须由一个名字为 coordinates 的成员。coordinates 成员的值总是数组。这个数组里的元素的结构由几何类型来确定。

点(Point)

1
2
3
4
{
"type": "Point",
"coordinates": [100.0, 0.0]
}

多点(MultiPoint)

1
2
3
4
5
6
7
{
"type": "MultiPoint",
"coordinates": [
[ 100, 0 ],
[ 101, 1 ]
]
}

线 (LineString)

1
2
3
4
5
6
7
{
"type": "LineString",
"coordinates": [
[ 100, 0 ],
[ 101, 1 ]
]
}

多线 (MultiLineString)

1
2
3
4
5
6
7
{
"type": "MultiLineString",
"coordinates": [
[ [100.0, 0.0], [101.0, 1.0] ],
[ [102.0, 2.0], [103.0, 3.0] ]
]
}

多边形 (Polygon)

  • 不带孔
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    {
    "type": "Polygon",
    "coordinates": [
    [
    [ 100, 0 ],
    [ 101, 0 ],
    [ 101, 1 ],
    [ 100, 1 ],
    [ 100, 0 ]
    ]
    ]
    }
  • 带孔的
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    {
    "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 ]
    ]
    ]
    }

多个多边形 (Polygon)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"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]
]
]
]
}

几何集合

1
2
3
4
5
6
7
8
9
10
{ "type": "GeometryCollection",
"geometries": [
{ "type": "Point",
"coordinates": [100.0, 0.0]
},
{ "type": "LineString",
"coordinates": [ [101.0, 0.0], [102.0, 1.0] ]
}
]
}

特征对象

类型为 FeatureGeoJSON 对象是特征对象。

特征对象必须由一个名字为 geometry 的成员,这个几何成员的值是上面定义的几何对象或者 JSON 的 null 值。特征对象那个必须有一个名字为 properties 的成员,这个属性成员的值是一个对象(任何 JSON 对象或者 JSON 的 null 值)。

1
2
3
4
5
{
"type":"Feature",
"properties":{},
"geometry":{ "type": "Point", "coordinates": [100.0, 0.0] }
}

特征集合对象

特征集合对象 typeFeatureCollection,必须有一个名字为 features 的属性。与 features 相对应的值是一个数组。这个数组中的每个元素都是上面定义的特征对象。

这个是一个基本的特征集合对象示例,包含点、线、多边形。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [102.0, 0.5]
},
"properties": {
"name": "点"
}
},
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[102.0, 0.0],
[103.0, 1.0],
[104.0, 0.0],
[105.0, 1.0]
]
},
"properties": {
"name": "线",
}
},
{
"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": {
"name": "多边形",
}
}
]
}

坐标参考系统对象

GeoJSON 对象的坐标参考系统(CRS)是由它的 crs 属性来确定的。如果对象没有 crs 属性,那么它的父对象或者祖父对象的 crs 属性可能被获取作为它的 crs。如果这样还没有获得 crs 成员,那么默认的 CRS 将应用到 GeoJSON 对象。

默认的 CRS 是地理坐标参考系统,使用的是 WGS84 数据。

1
2
3
4
5
6
7
8
9
10
{
"type": "FeatureCollection",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": []
}

边界框

通常情况下,坐标参考系统对象会包含几何、特征或者特征集合的坐标范围信息,GeoJSON 对象可能有一个名字为 bbox 的属性。bbox 属性的值必须是 2*n 数组,n 是所包含几何对象的维数(如二维简单的经纬度,将包含经度和纬度的最大值、最小值,如果是三维空间将多一个高度的最大值、最小值。),并且所有坐标轴的最低值后面跟着最高者值。bbox 的坐标轴的顺序遵循几何坐标轴的顺序。除此之外,bbox 的坐标参考系统假设匹配它所在 GeoJSON 对象的坐标参考系统。

  • 特征对象上的 bbox 成员的例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    {
    "type": "Feature",
    "bbox": [-180.0, -90.0, 180.0, 90.0],
    "geometry": {
    "type": "Polygon",
    "coordinates": [
    [
    [-180.0, 10.0], [20.0, 90.0], [180.0, -5.0], [-30.0, -90.0]
    ]
    ]
    }
    }
  • 特征集合对象 bbox 成员的例子
    1
    2
    3
    4
    5
    {
    "type": "FeatureCollection",
    "bbox": [100.0, 0.0, 105.0, 1.0],
    "features": []
    }