All the example files are in a GitHub repository: http://github.com/chillly/plaques
Leaflet displays a slippy map in an HTML div. It uses JavaScript to control the way the map behaves. The style, as you would expect, is controlled by CSS. Our first example displays a base map with an overlay of markers on it to show where blue plaques are around the UK city of Hull. Take a look here. The HTML is really straightforward, take a look in the GitHub repository above.
In the head section there is a style sheet for leaflet (leaflet.css) and a script (leaflet.js). These are used in every example. I have also included leaflet-hash.js which is an example of a Leaflet plug-in. I like to store CSS and JavaScript in separate files, not in the HTML file, so I have also included example1.css and example1.js. The JavaScript names plaques.js holds the locations of the plaques to display, formatted as a geojson file. The CSS simply makes the div, with the id “mapdiv”, fill the page. The real work is in the javascript:
/*
* global variables
*/
var map; // global map object
var lyrOsm; // the Mapnik base layer of the map
var lyrPlq; // the geoJson layer to display plaques with
// when the whole document has loaded call the init function
$(document).ready(init);
function init() {
// map stuff
// base layer
var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
var osmAttrib='Map data © OpenStreetMap contributors';
lyrOsm = new L.TileLayer(osmUrl, {
minZoom: 9,
maxZoom: 19,
attribution: osmAttrib
});
// a geojson
layer
lyrPlq = L.geoJson(plaques,{
onEachFeature: makePopup
}
);
// set the starting location for the centre of the map
var start = new L.LatLng(53.7610,-0.3529);
// create the map
map = new L.Map('mapdiv', { // use the div called mapdiv
center: start, // centre the map as above
zoom: 12, // start up zoom level
layers: [lyrOsm,lyrPlq] // layers to add
});
// create a layer control
// add the base layers
var baseLayers = { "OpenStreetMap": lyrOsm };
// add the overlays
var overlays = {
"Plaques": lyrPlq
};
// add the layers to a layer control
L.control.layers(baseLayers, overlays).addTo(map);
// create the hash url on the browser address line
var hash = new L.Hash(map);
}
function makePopup(feature, layer) {
// create a popup for each point
if (feature.properties && feature.properties.plaquedesc) {
layer.bindPopup(feature.properties.plaquedesc);
}
}
The file starts with global variables. The map variable is the core of Leaflet, any name would do, but it is called map by convention. The map has two layers, one to display the base map and one to show the markers. These are defined by two variables lyrOsm and lyrPlq.
The first use for jQuery is:
$(document).ready(init);
This means that when the document is completely loaded and ready call the function init. Doing this is very useful as on a slow link, such as some mobile connections. It makes sure that all of the elements of the page are available before trying to use them.
The init function needs to create the layers, create the map itself and add the layers to the map. We need two different layers one is the base layer which is a set of square tiles that Leaflet requests from the provider and arranges in the right place. We need to tell the layer where to get the tiles from, in this case the main OSM tile server.
var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
We also need to add attribution – all OSM-based maps need attribution as part of the licence to use the data.
var osmAttrib='Map data © OpenStreetMap contributors';
The tile provider may also require or request attribution. In one of the later examples will will use a different tile provider with a different attribution. We can now make a layer:
lyrOsm = new L.TileLayer(osmUrl, {
minZoom: 9,
maxZoom: 19,
attribution: osmAttrib
});
This creates the layer of tiles, from the tile provider, which will zoom out only to zoom level 9 and in to level 19 and add the attribution to the bottom right of the map, by default.
We also need a layer to display the plaque markers. In the HTML a file called plaques.js was loaded. That contains a geojson format file which we will use in a geojson layer. Geojson is a very useful format that I use frequently and is supported well by Leaflet. Geojson allows a variety of objects to be passed to Leaflet for displaying, including points, lines, multiple lines, polygons and multipolygons and these can be mixed together as needed. With a simple set of points the loaded file can be simply used as a layer. The file plaques.js creates a variable called plaques that can be used directly:
lyrPlq = L.geoJson(plaques, {
onEachFeature: makePopup
}
);
The onEachFeature is an example of responding to an event. In this case as each feature of the geojson file is added the function makePopup is called. This allows us to use one of the properties in each feature in the geojson file to be used to make a popup if the marker is clicked.
We now create a LatLng object to use to centre the map and then the map object is created:
map = new L.Map('mapdiv', { // use the div called mapdiv
center: start, // centre the map as above
zoom: 12, // start up zoom level
layers: [lyrOsm,lyrPlq] // layers to add
});
This creates the map, centres it, zooms to level 12 and adds the two layers we created above.
That would be enough to create a slippy map, but I added a couple of extra features which are often useful. The first is a layers control which allows the layers on the map to be selected and hidden. There are two types of layer a base layer and an overlay and we have one of each. The two layers are created, with names that will appear in the layer control, and the control is then created with the layers added and then added to the map.
The last feature is a leaflet plug-in. I added the leaflet-hash.js file to the leaflet folder and loaded it in the HTML. The hash plug-in changes the URL displayed in the browser address line as the map is scrolled and zoomed so the address can always be used as a bookmark. It replaces the permalink used on earlier versions. A simple line adds the plug-in to your map.
Following posts will show how to change the icons that appear, customise the popup, use database data to display the markers, deal with a large number of markers including clustering them and how to respond to click or tap in other ways than just displaying a popup.
3 comments:
I need to do this using Asp.net(C#) can you gelp me?
need to save the markers through asp.net to MSSQL
Can it be done??
I don't do dotnet so I can't help.
Post a Comment