Chciałbym uzyskać funkcję geojson z właściwościami z PostGIS. Znalazłem przykład, że mam kolekcję funkcji, ale nie mogę sprawić, by działała tylko dla funkcji.
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;
do tej pory próbowałem zmodyfikować zapytanie dotyczące kolekcji funkcji w przykładzie. ale dane wyjściowe są nieprawidłowe.
postgis
postgresql
geojson
sql
Poniżej radaru
źródło
źródło
Odpowiedzi:
Można to zrobić nieco prościej
json_build_object
w PostgreSQL 9.4+, który pozwala zbudować JSON poprzez dostarczanie przemiennych argumentów klucz / wartość. Na przykład:Sprawa staje się jeszcze lepsza w PostgreSQL 9.5+, gdzie dodano nowe operatory dla
jsonb
typu danych ( docs ). Ułatwia to ustawienie obiektu „właściwości”, który zawiera wszystko oprócz identyfikatora i geometrii .Chcesz zrobić FeatureCollection? Po prostu to wszystko
jsonb_agg
:źródło
regexp_replace(current_setting('server_version'),'(\d)\.(\d)\.(\d)','\1.\3.\2')
...json_build_object
ma dwukropki zamiast przecinków.ST_AsGeoJSON
funkcja PostGIS powinna zostać zmodyfikowana, aby samodzielnie korygować orientację.Tej odpowiedzi można użyć w wersji PostgreSQL wcześniejszej niż 9.4. Użyj odpowiedzi dbaston dla PostgreSQL 9.4+
Zapytanie jest następujące: (gdzie
'GEOM'
jest pole geometrii,id
pole do uwzględnienia we właściwościach json,shapefile_feature
nazwa tabeli i489445
identyfikator żądanej funkcji)wydajność:
źródło
dict
nie JSON. To są bardzo różne rzeczy. JSON jest ciągiem. Zawsze. Jest to format tekstowy, podobnie jak XML jest tylko formatem tekstowym. Adict
jest obiektem w pamięci.Wystarczy drobna korekta odpowiedzi dbaston (chciałbym skomentować, ale nie mam punktów) Musisz rzutować dane wyjściowe ST_AsGeoJSON jako json (rzecz
::json
):W przeciwnym razie element geometrii będzie ciągiem. To nie jest poprawny GeoJSON
źródło
@ dbaston za odpowiedź została zmodyfikowana ostatnio przez @John Powell aka Barçy, a to powoduje nieprawidłowe geojsons na mój koniec. Po zmodyfikowaniu agregacja funkcji zwraca każdą funkcję zagnieżdżoną w obiekcie json, co jest nieprawidłowe.
Nie mam reputacji, aby komentować bezpośrednio odpowiedź, ale końcowy plik jsonb_agg powinien znajdować się w kolumnie „funkcja”, a nie w podzapytaniu „funkcje”. Agregowanie nazwy kolumny (lub „features.feature”, jeśli uważasz, że jest to bardziej odpowiednie) umieszcza każdy element prosto w tablicy „features” po agregacji, co jest właściwą drogą.
Tak więc działa następująca, podobna do odpowiedzi @ dbaston, jak to było jeszcze kilka tygodni temu (plus korekta @Jonh Powell do nazewnictwa podzapytań):
źródło