如何编写Node API从PostGIS输出标准GeoJSON数据?
解决方法
你的问题出在直接返回了pool.query的完整结果对象,PostgreSQL客户端会把查询结果包装在rows数组里,而你需要的标准GeoJSON数据就藏在这个数组的第一个元素中。
修改后的完整API代码
router.get('/api/data', async(req, res) => { try { const queryResult = await pool.query( "SELECT json_build_object('type', 'FeatureCollection', 'features', json_agg(ST_AsGeoJSON(t.*)::json)) AS geojson FROM my_table AS t" ); // 提取聚合生成的GeoJSON对象 const standardGeoJSON = queryResult.rows[0].geojson; res.json(standardGeoJSON); } catch (err) { // 补充错误处理逻辑,生产环境必备 console.error(err); res.status(500).json({ error: '服务器内部错误' }); } });
核心修改说明
- 给SQL查询的字段添加别名
AS geojson,避免直接使用json_build_object这个冗长的默认字段名,提升代码可读性 - 从查询结果的
rows数组中取出第一个元素(因为你的聚合查询只会返回一行结果),提取对应的geojson属性值,这就是Leaflet可直接使用的标准GeoJSON结构 - 补充了缺失的
catch错误捕获块,处理查询过程中可能出现的数据库连接、SQL语法等问题
内容的提问来源于stack exchange,提问作者MidPiedmont
相关产品推荐
相关产品推荐

