[OpenLayers-Users] What is the easiest way to search a vector layer(s)?

Greg Allensworth gregor at greeninfo.org
Tue Feb 26 08:29:56 PST 2013


On 2/26/2013 5:13 AM, boesiii wrote:
> I would like to add a search function to my map using javascript only.

I did something like that, and you can see it here:

http://www.mapsportal.org/ggnpc/finder/?controls=1&thumbmap=1&customize=1&find=events&layers=ggnpc-events


Specifically, the campgrounds and trailheads are searched by scanning 
the in-memory features, and listing their attributes to a DIV.
It goes something like this:


// the layer "campgrounds" has a setting "searchfields" which is an 
array of attribute names which are searched for the keyword, and 
"titlefield" which defines which attribute is the item's Title.

new OpenLayers.Layer.Vector("campgrounds", {
         searchfields: [ 'name', 'description', 'location' ],
         titlefield: 'name',
         styleMap: new OpenLayers.StyleMap({
             'default' : new OpenLayers.Style({
                 externalGraphic: 'campground.png',
                 graphicOpacity:1, graphicWidth:20, graphicHeight:28
             })
         })
     });

// searchVector is the function to do a search, takes these 4 arguments
layer = MAP.getLayersByName('campgrounds')[0]
keyword = "Creek"
titlediv = $('#search_title');
resultdiv = $('#search_results');
searchVector(layer,keyword,titlediv,resultdiv);


// the search function. Loop over the searchfields and see
// whether it matches the searchterm. For your own need you may want to 
elaborate on this: the version here is a somewhat primitive search for 
your entire keyword, and doesn't handle searching for multiple words

function searchVector(layer,searchterm,title_div,results_div) {
     // no features? hide the output section and bail
     if (! layer.features.length) {
         title_div.hide();
         results_div.hide();
         handleNoResultsFound();
         return;
     }

     // iterate over each feature, assume it is NOT a match for the filter
     // iterate over the filter fields, see if this feature's value for 
that field fits the filter
     // if so, tag as a match and quit iterating for this feature
     var findcount = 0;
     searchterm = searchterm.toLowerCase();
     for (var p=0, fl=layer.features.length; p<fl; p++) {
         var feature = layer.features[p];
         var matched = false;
         for (var q=0, sl=layer.searchfields.length; q<sl; q++) {
             var field = layer.searchfields[q];
             try {
                 if 
(feature.attributes[field].toLowerCase().indexOf(searchterm) != -1) { 
matched = true; break; }
             } catch (e) {
                 true;
                 //console.error('Trying to use nonexistent searchfield: 
Layer ' + layer.name + ', Field: ' + field);
             }
         }
         if (! matched) continue;

         // if we got here, then the feature IS a match
         findcount++;
         var title  = feature.attributes[layer.titlefield];
         var bbox   = feature.geometry.getBounds();
         addToSearchResults(results_div,title,bbox);
     }

     // no matches? hide the output section and bail
     if (! findcount) {
         title_div.hide();
         results_div.hide();
     }
}




function addToSearchResults(results_div,title,bbox) {
     // make up the basic HTML of the title
     // optionally add something to do with the bbox, e.g. zoom the map
     var row  = $('<tr></tr>');
     var cell = $('<td></td>').text(title);
     row.append(cell);
}


-- 
Greg Allensworth, Web GIS Developer
BS  A+  Network+  Security+  Linux+  Server+
GreenInfo Network - Information and Mapping in the Public Interest
564 Market Street, Suite 510  San Francisco CA 94104
PH: 415-979-0343 x302  FX: 415-979-0371    email: gregor at greeninfo.org
Web: www.GreenInfo.org     www.MapsPortal.org

Subscribe to MapLines, our e-newsletter, at www.GreenInfo.org


More information about the Users mailing list