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

Postgis实现空间数据转GeoJSON (3)

PostGIS专栏 2020-03-20
1181


在空间数据转换GeoJSON第一篇中,用了Postgresql内置的row来构造行作为输入参数,这样可以选择指定字段进行转换,而不是全部属性字段,具有一定灵活性,如下图所示,选取gid,name字段加入转换:


有同学提出了一个缺点,就是使用row构造的行,会丢掉字段信息,转换后字段变成f1,f2,f3,比如:
select
/*使用row选取特定字段转构造行*/
  row_to_json(row(hp.code, hp.fclass, hp.name)) as json_row
from 
  henan_poi as hp
limit
  10

复制


结果如下,字段名都变成了f1,f2,f3:


那么我们需要修改的就是使用了row所在的哪一行,用一个子查询进行代替,修改如下:
select
/*三个字段作为整体,转换为json,作为一个字段json_row*/
  row_to_json(fields) as json_row
from
  (
    select
      hp.code, hp.fclass, hp.name
    from 
      henan_poi as hp
    limit
      10
  ) as fields

复制


结果如下,看起来正常了:


但是这也有个问题,我们只是将选定的三个字段转换为一个json字符串json_raw作为整体字段,如果想加别的字段,那么可以换一种写法,把他往上提一个等级,这个整体作为一个子查询,代码如下:

select
/*整个作为一个子查询命名为json_other_way,这也就可以加其他的字段,此时from表也要提到外边*/
  (
    select 
      row_to_json(fields) as json
    from
      (
        select
          hp.code, hp.fclass, hp.name
      ) as fields
  ) as "json_other_way"
from 
  henan_poi as hp

复制


结果和上个查询一样,不在截图,这里直接给出针对第一篇的修改后,用子查询代替row的完整代码:


总结,其实觉得Postgis3.0版本好用又简洁,性能也有提升,所以该升级就升级,另外这些转换都直接在数据库端用SQL语句实现,当然可以通过服务端业务代码对查询结果转换生成GeoJSON,SQL端生成速度可能相对快,但是传输数据量会增大,这里也体现了Postgresql面向对象的特性,支持json数据类型,很高级最重要的还是看使用场景看具体需求。

第1篇地址:Postgis实现空间数据转GeoJSON
第2篇地址:Postgis实现空间数据转GeoJSON (2)
文章转载自PostGIS专栏,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论