空间搜索-数据格式

geojson-bj

几何对象类型

  • Point 点
  • MultiPoint 多点
  • LineString 线条
  • MultiLineString 多线条
  • Polygon 多边形
  • MultiPolygon N个多边形
  • GeometryCollection 几何图形集合

Geo数据描述格式

WKT(Well-Known Text)

类型 图形 例子
Point SFA Point.svg POINT (30 10)
LineString SFA LineString.svg LINESTRING (30 10, 10 30, 40 40)
Polygon SFA Polygon.svg POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))
Polygon有孔 SFA Polygon with hole.svg POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10),(20 30, 35 35, 30 20, 20 30))
类型 图形 例子
MultiPoint SFA MultiPoint.svg MULTIPOINT ((10 40), (40 30), (20 20), (30 10)) 或者 MULTIPOINT (10 40, 40 30, 20 20, 30 10)
MultiLineString SFA MultiLineString.svg MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))
MultiPolygon SFA MultiPolygon.svg MULTIPOLYGON (((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))
MultiPolygon有孔 SFA MultiPolygon with hole.svg MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)),((20 35, 10 30, 10 10, 30 5, 45 20, 20 35),(30 20, 20 15, 20 25, 30 20)))
GeometryCollection SFA GeometryCollection.svg GEOMETRYCOLLECTION (POINT (40 10),LINESTRING (10 10, 20 20, 10 40),POLYGON ((40 40, 20 45, 45 30, 40 40)))

GeometryCollection是一个符合类型,用于表示多个复杂基本类型的集合。

需要重点关注:Polygon多边形的表示方式,当顶点顺序逆时针标识的是内部的多边形,顺时针标识的是外部的多边形,这点容易出错。应仔细观察图中有孔洞的表达形式。

GeoJSON

GeoJson

GeoJSON的类型与WKT一样,从名字上也可以看出是通过JSON来表达几何图形。除了GeometryCollection外,都必须包含一个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 ]
]
]
}
MultiPolygon
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"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]
]
]
]
}
GeometryCollection
1
2
3
4
5
6
7
8
9
10
11
12
13
{ 
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [100.0, 0.0]
},
{
"type": "LineString",
"coordinates": [ [101.0, 0.0], [102.0, 1.0] ]
}
]
}

此外,GeoJSON支持为集合类型添加特征属性,这就是feature类型,而多个feature类型可以组织成FeatureCollection形式。

Feature对象

特征对象必须由一个名字为”geometry”的成员,这个几何成员的值是上面定义的几何对象或者JSON的null值。

特征必须有一个名字为“properties”的成员,这个属性成员的值是一个对象(任何JSON对象或者JSON的null值)。

如果特征是常用的标识符,那么这个标识符应当包含名字为“id”的特征对象成员。

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

类型为”FeatureCollection”的对象必须由一个名字为”features”的成员, 用于包含多个Feature对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "顺义区",
"id": "110113"
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [
]
}
}
crs 坐标参考系统对象

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

bbox边界框

GeoJSON对象可能有一个名字为”bbox的成员。bbox成员的值必须是2*n数组,这儿n是所包含几何对象的维数,并且所有坐标轴的最低值后面跟着最高者值。


参考文档:

https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry

https://geojson.org/

https://juejin.im/post/5d8e0eaa5188250915506b9b

http://geojson.io/

https://tools.ietf.org/html/rfc7946