【问题标题】:How to create from a the following json array type a linestring geometry?如何从以下 json 数组类型创建线串几何?
【发布时间】:2021-12-17 08:04:07
【问题描述】:

我想在 postgresql 中使用 sql 语句创建 LineString 几何:

'LINESTRING(11.617730473115067 48.19782098770711, ..., ..., 11.618709999927699 48.19985004114398)'

来自以下 JSON 代码:

{ “类型”: [ "线串", “线串” ], “坐标”:[ [ 11.617730473115067, 48.19782098770711 ], [ 11.617959999927661, 48.19828004114453 ], [ 11.617999999927662, 48.1983600411445 ], [ 11.618139999927674, 48.19867004114437 ], [ 11.61840999992768, 48.19925004114419 ], [ 11.618709999927699, 48.19985004114398 ] ] }

如何将此 JSON 数组和连接拆分为 LineString 文本。

【问题讨论】:

  • 请展示你到目前为止做了什么?
  • 我问了一个 url,答案是一个很大的 JSON 请求。从这个 JSON 请求中,我使用以下语句选择上面的 json 部分: json_array_elements(json_array_elements("request" -> 'journeys') -> 'parts') -> 'wayPoints' -> 'coordinates' -> { "type" : [ "LineString", "LineString" ], "coordinates" --> 现在我不知道分割“坐标”并连接到几何表达式的下一步是什么

标签: arrays json postgresql


【解决方案1】:

要回答你的问题,你可以试试这个:

SELECT 'LINESTRING(' || string_agg(e.elt->>0 || ',' || e.elt->>1, ',' ORDER BY e.id) || ')'
  FROM json_array_elements(your_json_code->'coordinates') WITH ORDINALITY AS e(elt, id)

此查询使用与键“坐标”关联的 json 数组顺序中的元素构建 LINESTRING()

现在,在查看了您最初的问题中没有的 cmets 后,您可以试试这个:

SELECT 'LINESTRING(' || string_agg(e.elt->>0 || ',' || e.elt->>1, ',' ORDER BY e.id) || ')'
  FROM routing_import
 CROSS JOIN LATERAL jsonb_path_query(request :: jsonb, '$.journeys[*].parts[*].wayPoints.coordinates[*]') WITH ORDINALITY AS e(elt, id)

【讨论】:

  • 这是我的代码,直到获得 JSON 部分 --> 选择 json_array_elements(json_array_elements("request" -> 'journeys') -> 'parts') -> 'wayPoints' -> 'coordinates ' 来自 "routing_import" 的 JsonString;
  • 两个问题:第一个 -> string_agg 不起作用,e.elt 是整数 SQL-Fehler [42883]:FEHLER:运算符不存在:文本 ->> 整数,第二个 -> 0和 1 只交付数组中的第一个和第二个项目。该数组有超过 2 个项目。
  • 你的第一个问题:你能复制粘贴你的代码和错误吗? e.eltjsonb_path_query 函数的输出,因此它是 jsonb 类型,而不是您评论中所述的文本类型:“运算符不存在:文本 ->> 整数”。运算符jsonb->>integer根据位置从jsonb数组中提取一个元素并转换为文本,jsonb->>0用于提取第一个元素,jsonb->>1用于提取第二个元素,依此类推
  • 你的第二个问题:我已经更新了我的答案,在 coordinates 之后在 jsonb_path_query 函数的 jsonpath 中添加了 [*],以便取消嵌套与键 @ 关联的 json 数组的第一级987654331@'。这应该可以解决您的第二个问题。
  • 第一个问题:如果我使用你的代码,我会遇到失败 SQL-Fehler [42883]:FEHLER: Operator existiert nicht: text ->> integer Hinweis: Kein Operator stimmt mit dem angegebenen Namen und den Argumenttypen überein。 Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen。位置:61 = 运算符不存在,文本--> inetger - 你应该更改运算符的类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2015-03-08
  • 2011-06-23
  • 1970-01-01
相关资源
最近更新 更多