|||
前7篇博文,分别写了使用PG的JSONB类型的几个方面:
这一篇写写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...
解决办法可以参考:
另外,若想用含feature的geojson数据生成空间对象和属性字段,可以参考:
码字码了半天,手指头都麻了,如果觉得对您还有用的话,赞助一下辛苦费吧:
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 00:14
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社