diff --git a/app.js b/app.js index 054263a..5437849 100644 --- a/app.js +++ b/app.js @@ -170,7 +170,7 @@ async function searchParcela(event) { typeNames: PARCEL_LAYER_NAME, outputFormat: "application/json", srsName: "EPSG:3857", - CQL_FILTER: `cod_parcela = '${escapeCqlLiteral(parcelNumber)}'`, + CQL_FILTER: buildParcelSearchFilter(parcelNumber), }); const response = await fetch(`${API_WMS}?${params}`); @@ -198,7 +198,7 @@ async function searchParcela(event) { updateParcelSearchStatus( features.length === 1 ? `Found parcel ${parcelNumber}.` - : `Found ${features.length} parcels numbered ${parcelNumber}.`, + : `Found ${features.length} parcels matching ${parcelNumber}.`, "success", ); } catch (error) { @@ -207,6 +207,18 @@ async function searchParcela(event) { } } +function buildParcelSearchFilter(parcelNumber) { + const escapedParcelNumber = escapeCqlLiteral(parcelNumber); + + // Whole parcel numbers identify a group: 278 includes sub-parcels such as + // 278.1 and 278.2. A supplied sub-parcel number remains an exact lookup. + if (/^\d+$/.test(parcelNumber)) { + return `(cod_parcela = '${escapedParcelNumber}' OR cod_parcela LIKE '${escapedParcelNumber}.%')`; + } + + return `cod_parcela = '${escapedParcelNumber}'`; +} + async function loadLayers() { updateStatus("Loading WMS layers...");