暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Postgis实现空间数据转GeoJSON

PostGIS专栏 2020-03-11
1895


摘要:在开发过程中,有时了满足前端特定需求,或者数据交换的需要,在对地理空间数据进行一系列的查询、关联、分析后,需要返回geojson格式的空间数据,本篇就介绍如何通过Postgis和Postgresql提供的相关函数实现地理空间数据到GeoJSON格式的转换,功能比较实用,涉及不少知识点以此总结记录。

1

GeoJSON简介


首先还是简单介绍下GeoJSON,来自官网的解释:
GeoJSON is a format for encoding a variety of geographic data structures.
GeoJSON is a geospatial data interchange format based on JavaScript Object Notation (JSON). 

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格式基本结构如上图例子所示由外到内对其构进行解析,也是为实现格式转换做铺垫。


2.1  最外层是两个键值对, 这两个键值对基本固定。"type"字段表示类型,一般一个GeoJSON数据表示一个图层,简单理解为要素的集合,这里的值为"FeatureCollection","features"字段就是用来存放地理要素feature的数组,因此说GeoJSON不适合存放数据量大的图层:

最外层结构:
{
    "type""FeatureCollection"
    "features":[]
}


2.2  对于features数组里的每一个地理要素feature的格式也是固定的,一个feature由三个键值对组成:"type"字段的值是Feature,表明他是一个要素;"properties"字段包含了该地理要素的属性列表信息,即非几何属性数据,比如道路的属性有道路等级,长度,材质等,通常用键值对形式表示;"geometry"字段描述该地理要素的几何信息:

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 maxdecimald
igits=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  数据转换实现步骤:

第一步从ST_AsGeoJSON开始转换feature的几何信息;然后转换非几何信息,需要用到postgresql自带的row_to_json函数;此时feature包含了几何信息和非几何信息,再进行合并得到features数组,用到array_to_json,array_agg等函数,再补充特定字段,最后得到完整的GeoJSON对象。

以下给出将查询结果转换为GeoJSON对象的完整代码,其他查询或者分析以此类推,代码包括详细的注释,主要用到with查询,以及数组相关的聚合函数,都比较常用,最好熟练掌握。有问题可以后台交流,看到后回复。


4

总结


虽然功能小,但是比较实用,通过本篇也能学到一些小知识点以及相关函数的使用,主要包括:
  1. ST_AsGeoJSON的使用;

  2. row_to_json使用;

  3. array_agg聚合函数使用;

  4. array_to_json使用;

  5. row的定义使用和缺点;

文章转载自PostGIS专栏,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论