1
GeoJSON简介
GeoJSON是一种以文本形式描述地理空间数据的数据结构,以json键值对的形式对地理空间数据进行编码,WebGIS中较为常用,主要用于空间数据的交换共享,准确说是矢量数据,支持常见标准矢量数据类型,包括Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon 等,可以简单理解为,包含特定几何字段的json格式数据。
GeoJSON数据示例:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [
114.43359375,
30.637912028341123
]
}
}
]
}
2
结构解析
GeoJSON格式基本结构如上图例子所示,由外到内对其构进行解析,也是为实现格式转换做铺垫。
最外层结构:
{
"type":"FeatureCollection",
"features":[]
}
features结构:
{
"type": "Feature",
"properties": {}, //非几何信息
"geometry": {} //几何信息
}
2.3 geometry以坐标点或坐标串的形式描述该地理feature的几何信息,包括两个键值对,"type"字段的值是Feature,"coordinates"字段表示组成feature坐标的的数组:
feature几何信息结构:
{
"type": "Feature",
"coordinates": [] //坐标数组
}
3
要素转GeoJSON实现
数据转换实现上从内存到外层,按照其结构对数据一层一层的进行组装。首先介绍ST_AsGeoJSON函数,他只针对单个的geometry要素,将其转换为GeoJSON的一部分元素,并不能直接的按照他的函数字面意思,转为GeoJSON完整对象,不要被这个函数蒙蔽。【注意:首先介绍postgis3.0以下版本的实现方法,包括2.5, 2.4等,postgis3.0有所改进,后边介绍postgis3.0的实现】
3.1 ST_AsGeoJSON函数
函数声明如下,只需关注第一个参数即可,其他都采用默认值:
ST_AsGeoJSON函数声明:
text ST_AsGeoJSON(geometry geom, integer maxdecimaldigits=15, integer options=0);
text ST_AsGeoJSON(geography geog, integer maxdecimaldigits=15, integer options=0);
text ST_AsGeoJSON(integer gj_version, geometry geom, integer maxdecimaldigits=15, integer options=0);
text ST_AsGeoJSON(integer gj_version, geography geog, integer maxdecimaldigits=15, integer options=0);
功能描述:
ST_AsGeoJSON — Return the geometry as a GeoJSON element.
返回geometry作为GeoJSON数据的一个组成部分元素,即2.3节中的feature几何信息部分,为了满足数据转换,我们需要自己补充完整的GeoJSON信息,包括特定字段和非几何属性字段。
测试例子,以河南省的部分poi点数据为例:
select
hn.gid ,hn.name ,st_asgeojson(hn.geom) as geom_json ,hn.geom
from
henan_poi as hn
limit
20
查询结果如下,只是将poi数据的geom字段转为键值对json描述方式:
3.2 数据转换实现步骤:
4
总结
ST_AsGeoJSON的使用;
row_to_json使用;
array_agg聚合函数使用;
array_to_json使用;
row的定义使用和缺点;