Jump to main content
Benjamin Becquet

GeoJSON export in PostgreSQL without PostGIS

Here is a handy SQL query I used at work to export geographic point data as GeoJSON from a plain, "spatially-dumb" PostgreSQL database. By that, I mean without the awesome PostGIS extension which offers native GeoJSON support.

It makes use of high-level JSON functions that appeared in PostgreSQL 9.4, so this assumes you use at least this version.

SELECT json_build_object(
      'type', 'FeatureCollection',
      'features', json_agg(json_build_object(
        'type', 'Feature',
        'id', p.id,
        'geometry', json_build_object(
          'type', 'Point',
          'coordinates', json_build_array(p.longitude, p.latitude),
          -- assuming your coordinates are stored like that.
        ),
        'properties', json_build_object(
          'name', p.name,
          'address', p.address
          -- etc. Those are just examples of fields in the table.
        )
      ))
    )
    FROM my_places p;
    

With this indenting and thanks to the simple function signatures (lists of alternating keys and values), you can see the final JSON shape directly in the query. The json_agg function is an SQL aggregate (like avg, min, etc.) which reduces multiple values to a single JSON array.

Saved in a UTF-8 text file, the result is a valid GeoJSON FeatureCollection of Point features. It can be opened in QGIS, geojson.io, and a multitude of other tools.