Leaflet plugin for creating highlight area for specified street/place using Nominatim. This plugin adds onto Leaflet.Layer which makes highlighting places like streets, cities etc. a lot easier. It also handles the Nominatim paging of results.
Leaflet is required before adding L.Highlight. L.Highlight was tested on Leaflet v1.7.1
Clone the L.Highlight repository by doing:
git clone git@github.com:mmaciejkowalski/L.Highlight.git
In HTML, import the required Leaflet Javascript and CSS files.
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
In HTML, import the L.Highlight
<script src="leaflet-highlight.min.js"></script>
In Javascript, initialize your Leaflet Map
var map = L.map('map', {editable: true});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
In Javascript, add a layer with user or predefined input
// search for Politechniki Avenue around Łódź, Poland
new L.Layer.Highlight().do({q: 'Piotrkowska, Łódź'}).addTo(map);
You can also redefine your search for specific street in specific city, in case Nominatim would find another streets with this name in nearby cities.
// search for Politechniki Street exactly in Łódź, Poland
new L.Layer.Highlight().do({street: 'Piotrkowska', city: 'Łódź'}).addTo(map);
You can also do some more refined things.
// search for areas of Łódź University of Technology (Politechnika) in Łódź, Poland, color them red and attach click event handler alerting name of clicked area
new L.Layer.Highlight({email: 'your-email@example.com'}).do({
q: 'Politechnika, Łódź',
filter: 'Polygon',
}, {
style: function() {return {color: '#f00'}},
eventHandlers: {
click: function(area) {
alert(area.sourceTarget.feature.properties.display_name)
}
}
}).addTo(map);
Removing layers is also a possibility, just use
// search for areas of Łódź University of Technology (Politechnika) in Łódź, Poland, color them red and attach click event handler alerting name of clicked area
<layer>.removeFrom(<map>);
It is nice for using email while calling Nominatim, so be sure to include your email in L.Highlight initialisation.
new L.Layer.Highlight({email: your-email@example.com}).do({street: 'Piotrkowska', city: 'Łódź'}).addTo(map);
for styling, filtering, areas and more read API Documentation below or visit demo
L.Layer.Highlight accepts an initialisation object
{
email: string // as stated above, it is nice for using email while calling Nominatim
}
L.Layer.Highlight extends L.Layer, so it allows to use all the L.Layer methods except it will show nothing unless you deliberatly invoke the do(searchOpts, otherOpts)
before addTo()
.
The do(searchOpts, otherOpts)
method accepts two parameters:
{
q: string, // use this OR city & street
city: string, // use this OR q
street: string, // use this OR q
limit: number, // limit number of results from Nominatim
filter: string // limit search results for Features of this type
}
where q
is a basic search query, city
and street
used at the same time are for advanced street search. Do not use all three at the same time. Also, filter is a GeoJSON Feature name like Polygon
or LineString
.
{
style: Object,
eventHandlers: {
eventName1: function1,
eventName2: function2,
eventName3: function3,
...
}
}
Where style
is the same as in L.geoJSON and eventHandlers
is an object with event names as keys and event handlers as values. These event handlers are then translated to .on(<String> type, <Function> fn)
method, so:
{
eventHandlers: {
'click': function(clickTarget) { doSomething(clickTarget); }
}
}
will be translated inside L.Highlight
to:
.on('click', function(clickTarget) { doSomething(clickTarget); })
Probably in later releases the implementation of method on()
will be implemented