GeoJSON是一种基于Javascript对象表示法的
地理空间信息
数据交换格式。GeoJSON对象可以表示
几何
、
特征
或者
特征集合
。GeoJSON支持下面几何类型:
点、线、面、多点、多线、多面
和
几何集合
。GeoJSON里的特征包含一个
几何对象和其他属性
,特征集合表示
一系列特征
。
一个完整的GeoJSON数据结构总是一个(JSON术语里的)对象。在GeoJSON里,对象由名/值对--也称作成员的集合组成。对每个成员来说,名字总是字符串。成员的值要么是字符串、数字、对象、数组,要么是下面文本常量中的一个:"true","false"和"null"。数组是由值是上面所说的元素组成。
GeoJSON总是由一个单独的对象组成。这个对象(指的是下面的GeoJSON对象)表示几何、特征或者特征集合。
-
GeoJSON对象可能有任何数目成员(名/值对)。
-
GeoJSON对象必须有一个 名字为"type"的成员 。这个成员的值是由GeoJSON对象的类型所确定的字符串。
-
type成员的值必须是下面之一: "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", "GeometryCollection", "Feature", 或者 "FeatureCollection" 。
-
GeoJSON对象可能有一个可选的" crs "成员,它的值必须是一个坐标参考系统的对象。
-
GeoJSON对象可能有一个" bbox "成员,它的值必须是边界框数组。
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
|
GeoJSON特征集合:
{
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [102.0, 0.5]
},
"properties": {
"prop0": "value0"
}
}, {
"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"
}
}
}
]
}
|
点的数据格式
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [125.6, 10.1]
},
"properties": {
"name": "Dinagat Islands"
}
}
这
是一个特征feature。它包含几何要素和属性。几何要素包含要素的类型和坐标。属性可以包含各种数据类型。
线的数据格式
{
"type": "LineString",
"coordinates": [ [100.0, 0.0], [101.0, 1.0] ]
}
线状数据由两个以上的点组合而成,在坐标的外面多包上一层中括号,表示json中的数组。
面的数据格式
{
"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": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
"properties": {"prop0": "value0"}
},
{ "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"}
}
}
]
}
不同的数据类型间可以包成一个FeatureCollection
,最外层有个type
来表示类型,而features
指向各个feature
数组。有人肯定会疑惑shp中有proj的属性,geojson中可以用crs
和bbox
来表示投影参数和边界范围,详情参考。
案例
这里分享一个小案例。
网友问我,获取大批量线段的起点和终点。
我的第一反应就是并不是用arcpy等api,这方法也可行,但是并不是最简洁的方法。我的解决方法是最直接的:
- 通过qgis将shapefile文件转换成geojson
- 用python内置库json去解析获取数据
这样相对来说,虽然多了一个数据转换的过程,但是结合本章内容,geojson是文本,结构简洁,方便解析。数据可以很容易获取且替换。这个小实验作为课余作业。json的解析大概是10行代码左右,熟悉python的高手可能5行代码就搞定,比arcpy大大节省代码。
作者:brandonxiang
链接:https://www.jianshu.com/p/144033b1b87e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。