Ich möchte ein Geojson-Feature mit Eigenschaften von PostGIS erhalten. Ich habe ein Beispiel für eine Feature-Sammlung gefunden, kann sie jedoch nicht nur für ein Feature verwenden.
SELECT row_to_json(fc)
FROM ( SELECT 'FeatureCollection' As type, array_to_json(array_agg(f)) As features
FROM (SELECT 'Feature' As type
, ST_AsGeoJSON(lg.geog)::json As geometry
, row_to_json(lp) As properties
FROM locations As lg
INNER JOIN (SELECT loc_id, loc_name FROM locations) As lp
ON lg.loc_id = lp.loc_id ) As f ) As fc;
Bisher habe ich versucht, die Feature-Collection-Abfrage des Beispiels zu ändern. aber die Ausgabe ist ungültig.
postgis
postgresql
geojson
sql
Unter dem Radar
quelle
quelle
Antworten:
Dies kann mit
json_build_object
PostgreSQL 9.4+ ein bisschen einfacher gemacht werden, mit dem Sie einen JSON-Code erstellen können, indem Sie alternative Schlüssel- / Wertargumente angeben. Beispielsweise:Noch besser wird es in PostgreSQL 9.5+, wo einige neue Operatoren für den
jsonb
Datentyp ( docs ) hinzugefügt werden . Dies macht es einfach, ein "Eigenschaften" -Objekt einzurichten, das alles außer der ID und der Geometrie enthält .Möchten Sie eine FeatureCollection erstellen? Einfach alles einpacken mit
jsonb_agg
:quelle
regexp_replace(current_setting('server_version'),'(\d)\.(\d)\.(\d)','\1.\3.\2')
...json_build_object
hat Doppelpunkte anstelle von Kommas.ST_AsGeoJSON
Funktion von PostGIS geändert werden sollte, um die Ausrichtung selbst zu korrigieren.Diese Antwort könnte mit der PostgreSQL-Version vor 9.4 verwendet werden. Verwenden Sie die Antwort von dbaston für PostgreSQL 9.4+
Die Abfrage lautet wie folgt: (Wo
'GEOM'
ist das Geometriefeld,id
das Feld, das in den JSON-Eigenschaften enthalten sein soll,shapefile_feature
der Tabellenname und489445
die ID des gewünschten Features?)Ausgabe:
quelle
dict
, kein JSON. Das sind sehr unterschiedliche Dinge. JSON ist eine Zeichenfolge. Immer. Es ist ein Textformat, genauso wie XML nur ein Textformat ist. Adict
ist ein In-Memory-Objekt.Nur eine kleine Korrektur der Antwort von dbaston (ich würde kommentieren, aber ich habe keine Punkte). Sie müssen die Ausgabe von ST_AsGeoJSON als json (das
::json
Ding) umwandeln:Andernfalls ist das Geometriemitglied eine Zeichenfolge. Das ist kein gültiger GeoJSON
quelle
Die Antwort von @ dbaston wurde kürzlich von @ John Powell aka Barça geändert, und es entstehen auf meiner Seite ungültige Geojsons. In der geänderten Form gibt die Aggregation nach Features jedes Feature zurück, das in einem ungültigen json-Objekt verschachtelt ist.
Ich habe nicht den Ruf, die Antwort direkt zu kommentieren, aber das endgültige jsonb_agg sollte in der Spalte "feature" und nicht in der Unterabfrage "features" stehen. Wenn Sie den Spaltennamen aggregieren (oder "features.feature", wenn Sie ihn übersichtlicher finden), wird jedes Element nach der Aggregation direkt in das Array "features" eingefügt. Dies ist der richtige Weg.
Das Folgende, das der Antwort von @ dbaston bis vor einigen Wochen ziemlich ähnlich ist (plus der Korrektur von @ Jonh Powell für die Benennung von Unterabfragen), funktioniert also:
quelle