diff --git a/api/src/database/postgis/filters.ts b/api/src/database/postgis/filters.ts index 42c2e15..779807d 100644 --- a/api/src/database/postgis/filters.ts +++ b/api/src/database/postgis/filters.ts @@ -1,5 +1,7 @@ import { getDb } from './index'; import APIError from '../../helpers/APIError'; +import config from '../../config/config'; +import logger from '../../config/winston'; /** * Return bounding box in GeoJSON format used for filtering @@ -35,23 +37,23 @@ export const getBoundingBox = (bottomLeft: string, topRight: string) => { export const getProjectionFilter = async (proj, tableName, db = getDb()) => { // projection in query must correspond to SRID in geometry column if (proj) { - const SRIDarr = await db.distinct(db.raw(`ST_SRID(${tableName}.geometry)`)).from(tableName); + try { + const tableSRID = await db.select(db.raw(`Find_SRID('${config.postgresDb}', '${tableName}', 'geometry')`)); - if (!SRIDarr.length) { - return; - } - const SRID = SRIDarr[0].st_srid; - const projNum = parseInt(proj.split(':')[1], 10); + const projNum = parseInt(proj.split(':')[1], 10); - if (SRID === projNum) { - return projNum; + if (tableSRID === projNum) { + return projNum; + } + throw new APIError( + `Projection SRID ${projNum} doesn't correspond to geometry column SRID ${tableSRID}`, + 400, + true, + undefined, + ); + } catch (err) { + logger.error(`Table ${tableName} is missing SRID`); } - throw new APIError( - `Projection SRID ${projNum} doesn't correspond to geometry column SRID ${SRID}`, - 400, - true, - undefined, - ); } }; diff --git a/api/src/database/postgis/models/geoDataModel.ts b/api/src/database/postgis/models/geoDataModel.ts index 489ee99..1ef3059 100644 --- a/api/src/database/postgis/models/geoDataModel.ts +++ b/api/src/database/postgis/models/geoDataModel.ts @@ -34,6 +34,10 @@ const getGeoData = async ( JSON.stringify(filter.geometry), ]), ); + } else if (filter.geometry) { + qb.andWhere( + db.raw(`ST_Intersects(geometry, ST_SetSRID(ST_GeomFromGeoJSON(?), 0))`, [JSON.stringify(filter.geometry)]), + ); } if (Object.keys(properties).length) { Object.keys(properties).forEach((key) => {