2016-07-09 6 views
2

eine PostgreSQL 9.4 jsonb Spalte 'Standort' Gegeben mit Inhalt wie folgt aus:Postgis Abfrage ST_Intersects mit GeoJSON (jsonb)

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

die Funktionstaste 'geom' abzurufen verwende ich diese Abfrage:

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

Funktioniert. Aber jetzt würde Ich mag eine Postgis ST_Intersects Abfrage wie dies zu tun:

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; 

funktioniert nicht, da g.geom als jsonb geliefert: function st_intersects(jsonb, geometry) does not exist. Ich habe versucht, text zu werfen, der Fehler ist dann function st_intersects(text, geometry) is not unique. Wie muss ich mit jsonb Ergebnissen als Eingabe für Postgis-Funktionen umgehen?

Antwort

2

Zunächst einmal die Funktion jsonb_array_elements() einen Satz zurück, so sollten Sie es als table function in a FROM clause . Zweitens sollten Sie die Textdarstellung des jsonb-Felds mit dem ->>-Operator abrufen und dann dieses an geometry übergeben, das Sie dann in einer PostGIS-Funktion verwenden.

Um die Geometrien abzurufen, die nicht NULL sind:

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; 

die intersect zu tun:

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; 

Sie wollen wahrscheinlich so einige properties auf der Auswahlliste hinzuzufügen, dass Sie zwischen mehreren unterscheiden kann Geometrien für jede Zeile aus Ihrer Tabelle.

+0

Perfekt, danke! Eine kleine Frage: es scheint, es funktioniert ohne LATERAL Schlüsselwort auf die gleiche Weise ..? – Rainer

+0

Mit einer Tabellenfunktion ist das Schlüsselwort 'LATERAL' in der Tat optional, wie auch in der Dokumentation, auf die ich mich beziehe, beschrieben ist. Ich habe es hier für "Bildungszwecke" aufgenommen. – Patrick

+0

Hab es, danke nochmal Patrick! – Rainer

1

Um einen PostGIS-Geometrietyp aus der GeoJSON erstellen Sie die Funktion ST_GeomFromGeoJSON

Zum Beispiel verwenden können:

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

Ja, ich kenne diese Option. Aber ich würde gerne das vorberechnete "Geom" als Eingabe verwenden, nicht das GeoJSON-Objekt. Es war meine Hoffnung, diese zusätzliche Konvertierung (geomfromgeojson) zu vermeiden, um die Abfrage schneller zu machen. – Rainer

+0

rigth. Dann können Sie es mit ST_GeomFromWKB versuchen. Aber, wenn Sie die zusätzliche Konvertierung vermeiden möchten, denke ich, dass ich besser sein werde, erstellen Sie eine neue Geometrie-Spalte in Ihrer Tabelle. –

+0

leider funktioniert es nicht: Funktion st_geomfromwkb (jsonb) existiert nicht – Rainer