GeoMOOSE | ricerca esatta

In GeoMOOSE la ricerca degli oggetti viene configurata agendo sui file “app.js” e “mapbook.xml”. Per default l’operatore che effettua la ricerca è “ILIKE” che offre in risposta tutte le ricorrenze che contengono anche solo una parte della stringa o del numero cercato.

Se volessimo effettuare una ricerca esatta è necessario modificare il file app.js. Si riporta un esempio di codice di default e di quello modificato:

default:
———————————————————————-
app.registerService(‘search-particella’, SearchService, {
searchLayers: [‘particella-wfs/particella_patrimonio’],
fields: [
 {type: ‘text’, label: ‘Foglio’, name: ‘foglio_id’},
 {type: ‘text’, label: ‘Mappale’, name: ‘mappale’}
 ]
 });
———————————————————————-

modificato per ricerca esatta:
———————————————————————-
app.registerService(‘search-particella’, SearchService, {
fields: [
{type: ‘text’, label: ‘Foglio’, name: ‘foglio_id’},
{type: ‘text’, label: ‘Mappale’, name: ‘mappale’}
],
prepareFields: function (fields) {
// reformat the fields for the query engine,
// “*stuff*” will do a case-ignored “contains” query.
var query = [‘and’];
for(var i = 0, ii = fields.length; i < ii; i++) {
if(fields[i].value !== ” && fields[i].value !== undefined) {
query.push({
comparitor: ‘eq’,
name: fields[i].name,
value:fields[i].value
});
}
}
return [query];
},
searchLayers: [‘particella-wfs/particella_patrimonio’]
});
———————————————————————-

da notare l’inserimento del valore “comparitor: ‘eq'” che forza la corrispondenza esatta dei termini cercati. Questo operatore funziona con numeri e con stringhe. Tuttavia può succedere che la ricerca non funzioni se i campi sono di tipo “varchar” ma i termini di ricerca inseriti sono numeri, ottenendo l’errore in GeoMOOSE:

———————————————————————-

Error
msWFSGetFeature(): WFS server error. FLTApplyFilterToLayer() failed
msPostGISLayerWhichShapes(): Query error. Error executing query. Check
server logs

———————————————————————-

e controllando il log di PostgrSQL si ottiene:

———————————————————————-

ERROR: operator does not exists: character varying = integer at character 572
HINT: No operators found with given name and argument types. It may
be necessary to convert the indicated types.
INSTRUCTION: select
“gid”::text,”foglio_id”::text,”mappale”::text,”tipobene”::text,”numero_repertorio”::text,”vincolo”::text,”ex_num_rep”::text,”Note”::text,”tooltip”::text,”Controllo”::text,”AnnoRep”::text,ST_AsBinary(ST_Force2D(“the_geom”),’NDR’)
as geom,”gid”::text from particella_patrimonio where “the_geom” &&
ST_GeomFromText(‘POLYGON((1684664.20503714
5037777.87184059,1684664.20503714 5049622.92254882,1692749.83495607
5049622.92254882,1692749.83495607 5037777.87184059,1684664.20503714
5037777.87184059))’,find_srid(”,’particella_patrimonio’,’the_geom’))
and (((“foglio_id” = 2) and (“mappale” = 23)))

———————————————————————-

In questo caso (grazie infinite a Dan Little Duck) è necessario modificare il MAPFILE dichiarando il tipo di dato esplicitamente (nella sezione METADATA del LAYER) altrimenti Mapserver, ottenendo dei numeri come termini della ricerca, considera i valori come “int” anche se il campo che li contiene è di tipo “varchar”; il MAPFILE va quindi così modificato:

———————————————————————-

MAP
   LAYER
   …………..
   …….
      METADATA
      …….
         “gml_foglio_id_type” “Character”
         “gml_mappale_type” “Character”
      ……
      END
      …….
   END
   ……
END

———————————————————————-

Documentazione di riferimento: https://mapserver.org/ogc/wfs_server.html

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...