gpt4 book ai didi

javascript - PostgreSQL GeoJSON <- php -> JavaScript

转载 作者:可可西里 更新时间:2023-11-01 01:16:11 26 4
gpt4 key购买 nike

我正处于重建几乎一年前 build 的东西的阵痛中(不要问旧版本去了哪里——这很尴尬)。

核心功能使用 $.getJSON (ajax -ish) 在运行 PHP 脚本的 javascript 中调用,该脚本运行 PostgreSQL 查询,该查询构建 JSON 对象并返回它。 (暂停呼吸)。

问题在于 PostgreSQL 在轮到它大放异彩时会吐出什么。

我知道 build_json_object()build_json_array() PostgreSQL 9.4+ 中的功能,但是必须在其上运行的数据库之一尚未从 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 变量提供)。

当我 fetchAll(PDO::FETCH_ASSOC)该查询到 $result , 和 json_encode($result[0]["row_to_json"]) , 返回给 javascript 的对象是一个可以是 JSON.parse() 的对象'd 给出预期(一个 Object 和一个 FeatureCollection 又包含一堆 Feature s,其中一个是 geometry )。

到目前为止,一切都很好。快速 - 获取数据并在一秒钟左右返回。

问题在于,在查询阶段,与几何相关的东西数组被双引号引起来:个人的 JSON 的相关段 Feature好像
{"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 意义上) :“几何”位看起来像
"geometry":"{stuff}"

代替
"geometry":{stuff}

如果 PostgreSQL 生成的 JSON 通过 GeoJSONLint 的解析器/检查器,它会死在一个尖叫的堆中(它应该——它绝对不是“规范”)——当然它永远不会渲染:它吐出“无效类型” ' 如你所料。

目前,我已经通过一个 kludge (我的正常 M.O.)将它整理出来 - 当 $.getJSON返回对象,我
  • 把它变成一个字符串,然后
  • .replace(/"{/g, '{').replace(/}"/g, '}').replace(/\\/g, '') ,然后是
  • 把它变回一个物体并继续恶作剧。

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

    问题似乎很明显是 row_to_json()阶段:它看到“几何”的属性集,并将其与“属性”的属性集区别对待——它(错误地)引用-转义“几何”(在斜线转义所有双引号之后)一个但是(正确)将“属性”保留为原样。

    所以在这本书长度的前奏之后......问题。

    我遗漏或忽略的查询是否有细微差别?我已经为相关的 PostgreSQL 命令提供了 RTFD,除了美化开关之外,我一无所知。

    当然,如果有一种简洁的方式来完成整个往返,我会接受它:唯一需要注意的是它必须保留其“实时获取”性质 - $.getJSON在 Google Map 中的“空闲”触发的监听器下运行,源表、感兴趣的变量和缩放(确定 $bounds)是用户确定的。

    (将其视为一种通过平移和缩放来更新 map 图层的方法,方法是一次仅获取约 200-300 个简单(地籍)特征 -0 远好于为缩放 10-19 的整个状态。我敢打赌,有人已经在 bl.ocks 上做过这样的事情,但我还没有找到)。

    最佳答案

    看来你错过了 json 的类型转换。
    它应该是

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

    没有强制转换,st_asgeojson 返回一个字符串,它是双重编码的。

    但是,您也可以获取属性和 geoJson,而不是使用 PHP json_decode json,使用 php 创建 geoJson 特征集合数组,最后 json_encode 整个结果。

    关于javascript - PostgreSQL GeoJSON <- php -> JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38408633/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com