J'utilise une fonction de Le blog de Paul Ramsey pour interroger les données geoJSON d'une base de données postGIS. J'ai ajusté un peu la fonction, qui a fonctionné jusqu'à présent :
CREATE OR REPLACE FUNCTION rowjsonb_to_geojson(
rowjsonb JSONB,
geom_column TEXT DEFAULT 'geom')
RETURNS json AS
$$
DECLARE
json_props jsonb;
json_geom jsonb;
json_type jsonb;
BEGIN
IF NOT rowjsonb ? geom_column THEN
RAISE EXCEPTION 'geometry column ''%'' is missing', geom_column;
END IF;
json_geom := ST_AsGeoJSON((rowjsonb ->> geom_column)::geometry)::jsonb;
json_geom := jsonb_build_object('geometry', json_geom);
json_props := jsonb_build_object('properties', rowjsonb - geom_column);
json_type := jsonb_build_object('type', 'Feature');
return (json_type || json_geom || json_props)::text;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE STRICT;
J'en suis maintenant au point où je veux intégrer une ST_Transform(geom_column, 4326) pour me rendre les données lat/lng pour une application de brochure :
-
J'ai essayé d'ajuster la ligne
json_geom := ST_AsGeoJSON(((rowjsonb ->> ST_Transform(geom_column, 4326))::geometry)::jsonb;
ce qui ne fonctionne pas, car ST_Transform doit être effectué sur une géométrie et non sur un texte ou un json ;
-
Mon autre idée, déclarer une nouvelle variable geom_c et effectuer la transformation comme premièrement dans le bloc
geom_c := ST_Transform(geom_column, 4326)::geometry;
qui ne fonctionne pas non plus.
J'ai également essayé ce qui suit :
json_geom := ST_AsGeoJSON(rowjsonb ->> ST_Transform((geom_column->>'geom')::geometry, 4326))::jsonb;
ce qui renvoie l'erreur suivante : l'opérateur n'existe pas : texte ->> inconnu
json_geom := ST_AsGeoJSON(rowjsonb ->> ST_Transform(ST_GeomFromGeoJSON(geom_column), 4326))::jsonb;
qui donne l'erreur caractère inattendu (à l'offset 0)
Voici deux exemples de points de la table Standorts, que j'interroge :
"id": "0", "geom": "0101000020787F0000000000001DDF2541000000800B285441"
"id": "1", "geom": "0101000020787F000000000000EFE42541000000A074275441"
La requête que j'utilise est la suivante :
SELECT 'FeatureCollection' AS type,
'standorts' AS name,
json_build_object('type', 'name', 'properties',
json_build_object('name', 'urn:ogc:def:crs:OGC:1.3:CRS84')) AS CRS,
array_to_json(array_agg(rowjsonb_to_geojson(to_jsonb(standort.*)))) AS FEATURES FROM standort";
Puis-je même intégrer la fonction ST_Transform dans le segment de bloc ? Ou dois-je réécrire le bloc de manière logique ?