I visited the question showed in How to convert from PostgreSQL to GeoJSON format?
This PostGIS SQL transforms the whole table into a GeoJSON result:
SELECT row_to_json(fc) AS geojson FROM
(SELECT 'FeatureCollection' As type, array_to_json(array_agg(f))
As features FROM
(SELECT
'Feature' As type,
ST_AsGeoJSON((lg.geometry),15,0)::json As geometry,
row_to_json((id, name)) As properties
FROM imposm3_restaurants As lg) As f ) As fc;
I've found there that in the results, we don't get the name of the fields.
I expect the output as "properties":{"id":6323,"name":"Restaurant Sinaia"
but the actual output is "properties":{"f1":6323,"f2":"Restaurant Sinaia"
I read the specification of the row_to_json instruction, so I decided to change the last row_to_json instruction
SELECT row_to_json(fc) AS geojson FROM
(SELECT 'FeatureCollection' As type, array_to_json(array_agg(f))
As features FROM
(SELECT
'Feature' As type,
ST_AsGeoJSON((lg.geometry),15,0)::json As geometry,
row_to_json((lg)) As properties
FROM imposm3_restaurants As lg) As f ) As fc;
But now the geojson retrieves also the geometry field as a property.
I mean, into the results I can see the geometry formated in geojson format and again in PostGIS format (this second geometry is not necessary, I could waste it) so if the first result is 1200Kb, the second it will be around 2300Kb.
What can I do? any alternatives to
row_to_json((id, name)) As properties
or
row_to_json((lg)) As properties
I also tried things like
row_to_json(('id',lg.id ,'masa',lg.masa ,'parcela',lg.parcela)) As properties
and any others, but with no results (only SQL errors)
Thank you very much
What you need to do, is first select your columns then row_to_json this select. With your values, this will give following example :
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(geom)::json as geometry
, (
SELECT
row_to_json(t)
FROM (
SELECT
id
, name
) AS t
) AS properties
FROM imposm3_restaurants
) AS f
) AS fc
For passers by, you don't need subqueries and jsonb has slightly better performance. That being said, this shaved off ~150ms in dumping 11k records on a wide-ish table. To make this scale you'll definitely want to LIMIT
+ OFFSET
or toss in a WHERE
to filter out things you don't need
WITH features AS (
SELECT jsonb_build_object(
'type', 'Feature',
'geometry', ST_AsGeoJSON(geom)::jsonb,
'properties', jsonb_build_object(
'id', id,
'name', name
)
) AS feature
FROM imposm3_restaurants
)
SELECT jsonb_build_object(
'type', 'FeatureCollection',
'features', jsonb_agg(feature)
)::json
FROM features;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With