簡體   English   中英

Postgis查詢ST_Intersects與GeoJSON(jsonb)

[英]Postgis Query ST_Intersects with GeoJSON (jsonb)

給出PostgreSQL 9.4 jsonb列'location',內容如下:

{"type": "FeatureCollection","features": [
  {
    "properties": {},
    "geom": "01030000000100000004000000000000000000244000000000000049400000000000002840000000000000494000000000000026400000000000004A4000000000000024400000000000004940",
    "type": "Feature",
    "geometry": {"type": "Polygon", "coordinates": [[[10,50],[12,50],[11,52],[10,50]]]}             
  },
  {..},
  {..}
]}

要檢索功能鍵'geom',我使用此查詢:

SELECT geom
FROM (
  SELECT jsonb_array_elements(t.location -> 'features') -> 'geom' AS geom
  FROM my_object t) AS g
WHERE geom IS NOT NULL;

作品。 但現在我想做一個像這樣的Postgis ST_Intersects查詢:

SELECT ST_Intersects(g.geom, ST_GeomFromText('POINT(11 51)'))
FROM (
  SELECT t.iid, (jsonb_array_elements(t.location -> 'features') -> 'geom') AS geom
  FROM my_object t) AS g;

不能因為g.geom交付為jsonbfunction st_intersects(jsonb, geometry) does not exist 我嘗試轉換為text ,然后錯誤是function st_intersects(text, geometry) is not unique 我如何處理jsonb結果作為Postgis函數的輸入?

首先,函數jsonb_array_elements()返回一個集合,因此您應該將它作為FROM子句中表函數 其次,您應該使用->>運算符獲取jsonb字段的文本表示,然后將其轉換為隨后在PostGIS函數中使用的geometry

要檢索非NULL的幾何:

SELECT f.value ->> 'geom' AS geom
FROM my_object t
JOIN LATERAL jsonb_array_elements(t.location -> 'features') f ON true
WHERE f.value -> 'geom' IS NOT NULL;

做交叉:

SELECT t.iid, ST_Intersects((f.value->>'geom')::geometry, ST_GeomFromText('POINT(11 51)'))
FROM my_object t
JOIN LATERAL jsonb_array_elements(t.location -> 'features') f ON true;

您可能希望向選擇列表添加一些properties以便可以區分表中每行的多個幾何。

要從geojson創建postgis幾何類型,可以使用函數ST_GeomFromGeoJSON

例如:

SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-48.23456,20.12345]}');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM