From 099cf909c19db7df5fb9a7f555e07a684eafbea8 Mon Sep 17 00:00:00 2001 From: "D. Berge" Date: Tue, 11 Aug 2020 17:11:40 +0200 Subject: [PATCH] =?UTF-8?q?GIS=20raw:=20return=20=E2=80=9Cstalks=E2=80=9D?= =?UTF-8?q?=20showing=20the=20positioning=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/www/server/lib/db/gis/project/raw.js | 49 ++++++++++++++++-------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/lib/www/server/lib/db/gis/project/raw.js b/lib/www/server/lib/db/gis/project/raw.js index 74cb863..4520ad7 100644 --- a/lib/www/server/lib/db/gis/project/raw.js +++ b/lib/www/server/lib/db/gis/project/raw.js @@ -35,30 +35,45 @@ async function points (projectId, options = {}) { options.limit || 5000 ]; +// const text = ` +// SELECT ST_AsGeoJSON(t.*) geojson +// FROM ( +// SELECT rl.line sailline, rs.line, point, sequence, objref, tstamp, ST_Transform(geometry, 4326) geometry +// FROM raw_lines rl +// INNER JOIN raw_shots rs USING (sequence) +// WHERE +// ($1 IS true +// AND ST_Transform(geometry, 4326) && ST_MakeEnvelope($2, $3, $4, $5, 4326) +// ) +// OR ($1 IS false AND true) +// LIMIT $6 +// ) t +// `; + const text = ` - SELECT json_build_object( - 'type', 'FeatureCollection', - 'features', json_agg(geojson::json)) geojson + SELECT ST_AsGeoJSON(t.*, 'geometry') geojson, ST_AsGeoJSON(t.delta_geom) delta FROM ( - SELECT ST_AsGeoJSON(t.*) geojson - FROM ( - SELECT rl.line sailline, rs.line, point, sequence, objref, tstamp, ST_Transform(geometry, 4326) geometry - FROM raw_lines rl - INNER JOIN raw_shots rs USING (sequence) - WHERE - ($1 IS true - AND ST_Transform(geometry, 4326) && ST_MakeEnvelope($2, $3, $4, $5, 4326) - ) - OR ($1 IS false AND true) - LIMIT $6 - ) t - ) f; + SELECT rl.line sailline, rs.line, rs.point, sequence, objref, tstamp, ST_Transform(rs.geometry, 4326) geometry, + ST_Transform(ST_MakeLine(pp.geometry, rs.geometry), 4326) delta_geom + FROM raw_lines rl + INNER JOIN raw_shots rs USING (sequence) + LEFT JOIN preplot_points pp ON rs.line = pp.line AND rs.point = pp.point + WHERE + ($1 IS true + AND ST_Transform(rs.geometry, 4326) && ST_MakeEnvelope($2, $3, $4, $5, 4326) + ) + OR ($1 IS false AND true) + LIMIT $6 + ) t `; const res = await pool.query(text, values); if (res.rows && res.rows.length) { - return res.rows[0].geojson; + return res.rows.map(r => [ + JSON.parse(r.geojson), + JSON.parse(r.delta) + ]).flat(); } else { throw {status: 404}; }