Je souhaite une fonctionnalité geojson avec les propriétés de PostGIS. J'ai trouvé un exemple pour avoir une collection de fonctionnalités, mais je ne peux pas le faire fonctionner pour une fonctionnalité uniquement.
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;
Jusqu'à présent, j'ai essayé de modifier la requête de collection d'objets de l'exemple. mais la sortie n'est pas valide.
postgis
postgresql
geojson
sql
Au-dessous du radar
la source
la source
Réponses:
Cela peut être fait un peu plus simplement avec
json_build_object
PostgreSQL 9.4+, qui vous permet de construire un JSON en fournissant des arguments clé / valeur en alternance. Par exemple:Les choses s'améliorent encore dans PostgreSQL 9.5+, où de nouveaux opérateurs sont ajoutés pour le
jsonb
type de données ( docs ). Cela facilite la configuration d'un objet "propriétés" qui contient tout sauf l'id et la géométrie .Vous voulez faire une FeatureCollection? Terminez le tout avec
jsonb_agg
:la source
regexp_replace(current_setting('server_version'),'(\d)\.(\d)\.(\d)','\1.\3.\2')
...json_build_object
a des deux-points à la place de virgules.ST_AsGeoJSON
fonction de PostGIS doit être modifiée pour corriger l'orientation par elle-même.Cette réponse pourrait être utilisée avec la version de PostgreSQL antérieure à la 9.4. Utilisez la réponse de dbaston pour PostgreSQL 9.4+
La requête est la suivante: (où
'GEOM'
est le champ de géométrie,id
le champ à inclure dans les propriétés de JSON,shapefile_feature
le nom de la table et489445
l'identifiant de l'entité recherchée)sortie:
la source
dict
JSON, pas. Ce sont des choses très différentes. JSON est une chaîne. Toujours. C'est un format de texte, de la même manière que XML n'est qu'un format de texte. Adict
est un objet en mémoire.Juste une légère correction à la réponse de dbaston (je voudrais commenter mais je n'ai pas de points). Vous devez convertir la sortie de ST_AsGeoJSON en json (the
::json
thingie):Sinon, le membre géométrique sera une chaîne. Ce n'est pas valide GeoJSON
la source
La réponse de @ dbaston a été modifiée récemment par @John Powell, alias Barça, et elle produit des geojsons non valides de mon côté. Lorsqu’elle est modifiée, l’agrégation de fonctions renvoie chaque fonction imbriquée dans un objet JSON, qui n’est pas valide.
Je n'ai pas la réputation de commenter directement la réponse, mais le fichier jsonb_agg final doit figurer dans la colonne "feature" et non dans la sous-requête "features". L'agrégation sur le nom de la colonne (ou "features.feature" si vous la trouvez plus nette) place chaque élément directement dans le tableau "features" après l'agrégation, ce qui est la bonne façon de procéder.
Donc, ce qui suit, qui est assez similaire à la réponse de @ dbaston telle qu'elle l'était il y a quelques semaines (plus la correction de @Jonh Powell en nommant les sous-requêtes) fonctionne:
la source