Saya ingin mendapatkan fitur geojson dengan properti dari PostGIS. Saya telah menemukan contoh untuk memiliki koleksi fitur tetapi saya tidak dapat membuatnya berfungsi hanya untuk fitur.
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;
sejauh ini saya mencoba mengubah kueri kumpulan fitur dari contoh. tetapi hasilnya tidak valid.
postgis
postgresql
geojson
sql
Di bawah Radar
sumber
sumber
Jawaban:
Ini dapat dilakukan sedikit lebih sederhana dengan
json_build_object
di PostgreSQL 9.4+, yang memungkinkan Anda membangun JSON dengan memasok argumen kunci / nilai yang bergantian. Sebagai contoh:Segalanya menjadi lebih baik di PostgreSQL 9.5+, di mana beberapa operator baru ditambahkan untuk
jsonb
tipe data ( dokumen ). Ini membuatnya mudah untuk mengatur objek "properti" yang berisi segalanya kecuali id dan geometri .Ingin membuat FeatureCollection? Bungkus semuanya dengan
jsonb_agg
:sumber
regexp_replace(current_setting('server_version'),'(\d)\.(\d)\.(\d)','\1.\3.\2')
...json_build_object
memiliki titik dua bukan koma.ST_AsGeoJSON
fungsi PostGIS harus dimodifikasi untuk memperbaiki orientasi sendiri.Jawaban ini dapat digunakan dengan versi PostgreSQL anterior hingga 9.4. Gunakan jawaban dbaston untuk PostgreSQL 9.4+
Kueri adalah sebagai berikut: (di mana
'GEOM'
bidang geometri,id
bidang untuk dimasukkan dalam properti json,shapefile_feature
nama tabel, dan489445
id dari fitur yang diinginkan)keluaran:
sumber
dict
, bukan JSON. Mereka adalah hal yang sangat berbeda. JSON adalah sebuah string. Selalu. Ini format teks, dengan cara yang sama XML hanya format teks. Adict
adalah objek dalam memori.Hanya sedikit koreksi pada jawaban dbaston (saya ingin berkomentar tapi saya tidak punya poin) Anda harus menggunakan output ST_AsGeoJSON sebagai json (the
::json
thingie):Kalau tidak, anggota geometri akan menjadi string. Itu tidak sah GeoJSON
sumber
@ dbaston jawaban telah dimodifikasi akhir-akhir ini oleh @ John Powell alias Barça, dan itu menghasilkan geojsons tidak valid pada akhirnya. Saat dimodifikasi, agregasi pada fitur mengembalikan setiap fitur yang bersarang di dalam objek json, yang tidak valid.
Saya tidak memiliki reputasi untuk mengomentari jawabannya secara langsung, tetapi jsonb_agg terakhir harusnya ada di kolom "fitur" dan bukan pada subquery "fitur". Menggabungkan pada nama kolom (atau "fitur.fitur" jika Anda menemukannya lebih rapi) menempatkan setiap elemen langsung dalam array "fitur" setelah agregasi, yang merupakan cara yang tepat untuk pergi.
Jadi berikut ini, yang sangat mirip dengan jawaban @ dbaston seperti sampai beberapa minggu yang lalu (ditambah koreksi @Jonh Powell untuk penamaan subquery) tidak berfungsi:
sumber