Me gustaría obtener una función geojson con propiedades de PostGIS. He encontrado un ejemplo para tener una colección de características, pero no puedo hacer que funcione solo para una característica.
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;
Hasta ahora intenté modificar la consulta de recopilación de características del ejemplo. pero el resultado no es válido.
postgis
postgresql
geojson
sql
Debajo del radar
fuente
fuente
Respuestas:
Esto se puede hacer un poco más simplemente con
json_build_object
PostgreSQL 9.4+, que le permite construir un JSON al proporcionar argumentos alternativos de clave / valor. Por ejemplo:Las cosas mejoran aún más en PostgreSQL 9.5+, donde se agregan algunos operadores nuevos para el
jsonb
tipo de datos ( docs ). Esto facilita la configuración de un objeto de "propiedades" que contiene todo menos la identificación y la geometría .¿Quieres hacer una FeatureCollection? Simplemente envuélvelo con
jsonb_agg
:fuente
regexp_replace(current_setting('server_version'),'(\d)\.(\d)\.(\d)','\1.\3.\2')
...json_build_object
tiene dos puntos en lugar de comas.ST_AsGeoJSON
función de PostGIS debe modificarse para corregir la orientación por sí sola.Esta respuesta podría usarse con la versión PostgreSQL anterior a 9.4. Use la respuesta de dbaston para PostgreSQL 9.4+
La consulta es la siguiente: (donde
'GEOM'
está el campo de geometría,id
el campo a incluir en las propiedades json,shapefile_feature
el nombre de la tabla y489445
es la identificación de la característica deseada)salida:
fuente
dict
, no JSON. Son cosas muy diferentes. JSON es una cadena. Siempre. Es un formato de texto, de la misma manera que XML es solo un formato de texto. Adict
es un objeto en memoria.Solo una ligera corrección a la respuesta de dbaston (quisiera comentar pero no tengo puntos) Necesitas lanzar la salida de ST_AsGeoJSON como json (la
::json
cosita):De lo contrario, el miembro de geometría será una cadena. Eso no es válido GeoJSON
fuente
La respuesta de @Dbaston ha sido modificada recientemente por @John Powell, también conocido como Barça, y produce geojsons inválidos de mi parte. Tal como se modificó, la agregación de características devuelve cada característica anidada dentro de un objeto json, que no es válida.
No tengo la reputación de comentar directamente sobre la respuesta, pero el jsonb_agg final debería estar en la columna "característica" y no en la subconsulta "características". La agregación en el nombre de la columna (o "features.feature" si lo encuentra más ordenado) coloca todos los elementos directamente en la matriz de "características" después de la agregación, que es el camino correcto.
Entonces, lo siguiente, que es bastante similar a la respuesta de @Dbaston, ya que fue hasta hace unas semanas (más la corrección de @Jonh Powell para nombrar subconsultas) funciona:
fuente