hillpig的个人博客分享 http://blog.sciencenet.cn/u/hillpig 畅想ing,思考ing,前行ing Email:bluevaley@gmail.com

博文

把st_asgeojson字符串输出成json对象(PG JSON系列8)

已有 9875 次阅读 2017-1-2 09:35 |个人分类:postgresql|系统分类:科研笔记| GEOJSON

前7篇博文,分别写了使用PG的JSONB类型的几个方面:

  1. 使用PostgreSQL中的row_to_json()直接获得JSON(PG JSON系列1)

  2. JSON/JSONB如何做增删改查(PG JSON系列2)

  3. 组合使用PostgreSQL的ARRAY和JSONB数据类型(PG JSON系列3)

  4. PG中验证JSON Schema(PG JSON系列4)

  5. PG中JSONB存储和访问效率(PG JSON系列5)

  6. Node.js如何方便的使用PostgreSQL中的JSONB数据(PG JSON系列6)

  7. PG历代版本对JSON的支持情况(PG JSON系列7)

这一篇写写GEOJSON。

我们知道PostgreSQL里对地理空间数据(注意不是几何体)的支持是通过PostGIS(http://postgis.net/ )实现的。在PostGIS中提供了一个函数st_asgeojson(http://postgis.net/docs/manual-2.3/ST_AsGeoJSON.html  ),可以直接把空间对象输出为JSON字符串。如文档给出的示例如下:

SELECT ST_AsGeoJSON('LINESTRING(1 2 3, 4 5 6)');

---------------------------------------------------

{"type":"LineString","coordinates":[[1,2,3],[4,5,6]]}

注意上面输出的是字符串,问题来了,如果我们用类似下面的SQL语句:

WITH myTrace AS (select a.id as owner,st_asgeojson(a.location) as geometry from tactivity2 a where a.id = 1)

SELECT row_to_json(b.*) from myTrace b

输出下面结果(ST_AsGeoJSON输出的字符串的双引号做了转义):

"{"owner":1,"geometry":"{"type":"Point","coordinates":[116.468831,39.974896]}"}"

即有时候我希望输出的是json对象,而不是json字符串,我们需要使用类型转换,即如下SQL:

WITH myTrace AS (select a.id as owner,st_asgeojson(a.location)::jsonb as geometry from tactivity2 a where a.id = 1)

SELECT row_to_json(b.*) from myTrace b

然后才能得到我们想要的:

"{"owner":1,"geometry":{"type": "Point", "coordinates": [116.468831, 39.974896]}}"


特别注意:st_asgeojson只是实现了geojson规范中的geometry部分,没有实现feature部分,这个可以参考(http://postgis.net/docs/manual-2.3/ST_AsGeoJSON.html):

GeoJSON only support SFS 1.1 geometry type...

解决办法可以参考:

http://gis.stackexchange.com/questions/112057/sql-query-to-have-a-complete-geojson-feature-from-postgis


另外,若想用含feature的geojson数据生成空间对象和属性字段,可以参考:

http://gis.stackexchange.com/questions/142391/store-a-geojson-featurecollection-to-postgres-with-postgis



码字码了半天,手指头都麻了,如果觉得对您还有用的话,赞助一下辛苦费吧:






https://blog.sciencenet.cn/blog-419883-1024848.html

上一篇:如何做产品原型设计(GUI prototyping)(全栈工程师系列2)
下一篇:使用百度地图API展示服务端传回的GEOJSON数据(PG JSON系列9)
收藏 IP: 61.135.169.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-25 16:29

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部