PostgreSQL GeoJSON<-php->JavaScript [英] PostgreSQL GeoJSON <- php -> JavaScript

查看:30
本文介绍了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(/}"/g, '}').replace(/\/g, ''),然后
  3. 将其转换回对象并继续恶作剧。

这不是好做法(至少可以说):如果可以鼓励查询本身返回有效的GeoJSON,那就更好了。

似乎很明显,问题出在row_to_json()阶段:它看到的是"几何图形"的属性集,并将其与"特性"的属性集不同地对待--它(错误地)引号转义了"几何图形"(在斜杠转义所有双引号之后)一个,但(正确地)保留了"属性"的原样。

所以在这本书那么长的序曲之后。问题。

我遗漏或忽略的查询有什么细微差别吗?我有相关的PostgreSQL命令的RTFD,除了修饰开关之外,我什么都不知道。

当然,如果有一种简单的方法来完成整个往返行程,我会接受它:唯一的警告是它必须保留它的‘live-fetch’性质--$.getJSON运行在一个监听程序下,该监听程序触发Google Map中的"空闲",并且源表、感兴趣的变量和缩放(它决定$bounds)是用户确定的。

(可以将其视为一种使用平移和缩放来更新地图层的方法,每次只获取约200-300个简单的(地籍)要素--这比为整个州生成一个平移和缩放金字塔10-19要好得多。我打赌已经有人在BLOCKS上做了这样的事情,但我还没有找到它)。

推荐答案

您似乎错过了JSON的演员阵容。 它应该是

ST_AsGeoJSON(ST_Transform(lg.g1,4326))::json

如果不进行强制转换,st_asGeojson将返回一个双重编码的字符串。

不过,您也可以获取属性和GeoJson,然后用PHP对json进行json_解码,用php创建一个GeoJson特征收集数组,最后对整个结果进行json编码。

这篇关于PostgreSQL GeoJSON&lt;-php-&gt;JavaScript的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆