C'est la vie

生きてる事が 時には辛くて

0%

几何图形数据WKT、GeoJSON和Esri JSON之间的区别与联系

简述一下背景

最近在工作中接触了一些和不同类型的存储矢量数据的数据,往往要把获取到的这些数据转变为可以在ArcGIS中显示的矢量图形,所以研究了一下各种类型数据的格式。

WKT数据

WKT(Well-known text)我主要是在一些网站的返回数据里见过,格式大致是这样的:

POINT (30 10)

  • 线

LINESTRING (30 10, 10 30, 40 40)

  • 多条线

MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))

POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))

  • 多个面

MULTIPOLYGON (((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))

有一个可以在线绘制的网站 wkt在线绘制

GeoJSON

与WKT数据不同的地方除了格式不一样之外,GeoJSON还可以存储图形的属性数据

可以在ArcGIS Pro里通过工具箱工具转换为矢量数据,具体方法为【工具箱】-【转换工具】-【JSON】-【JSON转要素】

在ArcMap中只可以把要素转为GeoJSON,反过来不行,操作方法类似上面,最后一步要选【要素转JSON】,输出时有一个可选项【GeoJSON(可选)】,选中就可以输出了。

有一个可以在线绘制的网站 geojson在线绘制

总体结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"type": "FeatureCollection",
"features": [
{
"type" : "Feature",
"id" : 1,
"geometry" : {
"type" : "MultiLineString",
"coordinates" : 略,格式见下面,
},
"properties" : {
"OBJECTID" : 1,
"name" : "test_name",
"name2" : " ",
"name1" : " ",
"Shape_Leng" : 0,
"Shape_Length" : 0.054554424628696016
}
}
]
}

其中”properties”里具体的属性可以自定义,上面只是示意。

上面”geometry”字段的属性也就是图形信息的格式如下:

{ “type”: “Point”, “coordinates”: [30, 10] }

  • 线

{ “type”: “LineString”, “coordinates”: [ [30, 10], [10, 30], [40, 40] ] }

  • 多条线

{ “type”: “MultiLineString”, “coordinates”: [ [[10, 10], [20, 20], [10, 40]], [[40, 40], [30, 30], [40, 20], [30, 10]] ] }

{ “type”: “Polygon”, “coordinates”: [ [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]] ] }

  • 多个面

{ “type”: “MultiPolygon”, “coordinates”: [ [ [[30, 20], [45, 40], [10, 40], [30, 20]] ], [ [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]] ] ] }

Esri JSON

这个是可以导入到ArcMap或者ArcGIS Pro里的JSON数据格式,都可以通过工具箱工具转换为矢量数据,具体方法为【工具箱】-【转换工具】-【JSON】-【JSON转要素】

整体的结构可以参考 官方说明文档 JSON Response syntax

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"objectIdFieldName" : "<objectIdFieldName>", //optional
"globalIdFieldName" : "<globalIdFieldName>", //optional
"displayFieldName" : "<displayFieldName>", //optional
"geometryType" : "<esriGeometryPoint | esriGeometryMultipoint | esriGeometryPolyline | esriGeometryPolygon | esriGeometryEnvelope>",
"spatialReference" : <spatialReference>, //for feature layers only.
"hasZ" : <true|false>, //optional Default is false.
"hasM" : <true|false>, //optional Default is false.
"fields" : [
{"name" : "<fieldName1>", "type" : "<fieldType1>", "alias" : "<fieldAlias1>", "length" : "<length1>"},
{"name" : "<fieldName2>", "type" : "<fieldType2>", "alias" : "<fieldAlias2>", "length" : "<length2>"}
],
"features" : [ //features will include geometry for feature layers only
<feature1>, <feature2>
]
}

大多都是可选的字段,必选的有表示图形元素类型的"geometryType"、表示坐标系的"spatialReference"、表示各图形元素中字段的基本信息的"fields",这里也相当于是ArcGIS里查看的矢量数据的属性表里的表头部分,"features"是一个列表,包括了每一个具体的图形要素,其中每个要素均为一个字典,包括表示属性的"attributes"和表示空间信息的"geometry"两个键,其中"attributes"是由描述要素各个属性的键值对组成,所有的键需要在前面"fields"中出现过才可以。

每一类图形要素的格式可以参考官方文档 Geometry objects

上面”geometry”字段的属性:

{
“x”: -118.15,
“y”: 33.80,
}

  • 线
    1
    2
    3
    4
    5
    6
    7
    8
    {
    "paths": [
    [
    [<x11>, <y11>],
    [<x1N>, <y1N>]
    ]
    ],
    }
  • 多条线
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    {
    "paths": [
    [
    [<x11>, <y11>],
    [<x1N>, <y1N>]
    ],
    [
    [<xk1>, <yk1>],
    [<xkM>, <ykM>]
    ]
    ],
    }
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    {
    "rings": [
    [
    [<x11>, <y11>],
    [<x1N>, <y1N>],
    [<x11>, <y11>],//终点坐标应该于起点坐标一致,不过也许也可以省略
    ]
    ],
    }
  • 多个面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"rings": [
[
[<x11>, <y11>],
[<x1N>, <y1N>],
[<x11>, <y11>], //终点坐标应该于起点坐标一致,不过也许也可以省略
],
[
[<xk1>, <yk1>],
[<xkM>, <ykM>],
[<xk1>, <yk1>],//终点坐标应该于起点坐标一致,不过也许也可以省略
]
],
}

一些参考资料

GeoJSON三分钟入门教程

WKT与GeoJson

WKT 维基百科 Well-known text representation of geometry

esri-json标准的json文件和geojson文件

JSON数据格式在GIS领域的运用

什么是GeoJSON

JSON格式化工具网站1

JSON格式化工具网站2