沃梦达 / 编程问答 / php问题 / 正文

PostgreSQL GeoJSON<-php->JavaScript

PostgreSQL GeoJSON lt;- php -gt; JavaScript(PostgreSQL GeoJSONlt;-php-gt;JavaScript)

本文介绍了PostgreSQL GeoJSON<-php->JavaScript的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在痛苦地重建几乎一年前建造的东西(不要问旧版本到哪里去了--太尴尬了)。 核心功能在运行PHP脚本的Java脚本中使用$.getJSON(ajax-ish)调用,该脚本运行构建JSON对象并返回该对象的PostgreSQL查询。(暂停呼吸)。

问题在于轮到它发光时,PostgreSQL会吐出什么。

我知道PostgreSQL 9.4+中的build_json_object()build_json_array()功能,但必须在其上运行此操作的其中一个数据库尚未从9.2升级,我在下个月左右没有时间这样做。

目前,我使用row_to_json()(在几何体上使用ST_AsGeoJSON())来构建我的GeoJSON集合,该集合通过回调返回到客户端。

按照this very nice post的提示(并保持在该帖子的查询结构的非常小的epsilon内),我运行以下查询:

select row_to_json(fc)
from (SELECT 'FeatureCollection' As type, 
      array_to_json(array_agg(f)) As features
from (SELECT 'Feature' as type,
      row_to_json((select l from (select $vars) as l)) as properties,
      ST_AsGeoJSON(ST_Transform(lg.g1,4326)) as geometry    
        from $source_table as lg   
 where g1 && ST_Transform(ST_SetSRID(ST_MakeEnvelope($bounds),4326),4283)
 ) as f ) as fc;

($vars$source_table$bounds由PHP从POST变量中提供)。

当IfetchAll(PDO::FETCH_ASSOC)查询<[2-11]和json_encode($result[0]["row_to_json"])时,返回给javascrip对象是一个对象,可以对该对象进行运算以提供预期的(具有FeatureCollection的对象,而该对象又包含一串,其中一个是)。

到目前为止,一切顺利。快速获取数据,并在一秒左右的时间内返回。

问题是,在查询阶段,与几何图形相关的内容数组是用双引号引起来的:单个Feature的JSON的相关片段如下所示

{"type":"Feature","geometry":"{\"type\":\"Polygon\",
                              \"coordinates\":"[[[146.885447408,-36.143199088],
                                               [146.884964384,-36.143136232],
                                                ... etc
                                             ]]"
                              }",
                              "properties":{"address_pfi":"126546461",
                                            "address":"blah blah",
                                             ...etc }
}

这是我将PostgreSQL查询结果复制到文件时得到的结果:这是在任何错误处理输出之前得到的。

请注意只影响几何{type, coordinates}属性(非JSON意义上)的(双转义)双引号{type, coordinates}:"几何"位看起来像

"geometry":"{stuff}"

而不是

"geometry":{stuff}

如果PostgreSQL生成的JSON被放入GeoJSONLint的解析器/检查器,它就会死在尖叫堆中(它应该这样--它绝对不是‘规范’)--当然,它永远不会呈现:正如你所想的那样,它会吐出‘无效类型’。

目前我只是用一种杂乱无章的方法(我的正常操作方式)对它进行了排序--当$.getJSON返回对象时,我

  1. 将其转换为字符串,然后
  2. .replace(/"{/g, '{').replace(

本文标题为:PostgreSQL GeoJSON&lt;-php-&gt;JavaScript

基础教程推荐