Click here to Skip to main content
15,892,253 members
Articles / Web Development / HTML
Tip/Trick

Leaflet.js - A Simple Example

Rate me:
Please Sign up or sign in to vote.
4.69/5 (5 votes)
17 Mar 2015CPOL1 min read 40.3K   1.1K   10   5
How to use Leaflet.js to easily create a map with custom markers, popups, baselayers and overlays menu, WMS overlays

Introduction

If you need a quick and easy, mobile-friendly map with markers and the possibility to add Web Map Service overlays, then a very good library for you to consider is Leaflet.js.  

In this tip, I will share with you a simple example of how leaflet.js works.

I've wrapped up a few basic features of leaflet.js in a JavaScript object which I called mapManager: if you like it, feel free to download it, use it, modify it and extend it at your convenience! 

You can also find it on github at https://github.com/nickygiorgi/leaflet.js-simple-example.

Using the Code

Your map will reside inside a div with an id of your choice:

HTML
<div id="map"></div>

In your JavaScript code, you'll want to be able to perform some basics, which I've wrapped up in mapManager. 

For example, you will need to initialize a map object (L.Map class) and create its base layers (L.tileLayer):

JavaScript
init: function (divID, center, zoom) {
        
        // a map has one or more base layers which define the map's general aspect        

        // for example, openstreetmap provides some base layers free to use
        // openstreetmap initialization
        var mbAttr = 'Map data &copy; 
        <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
                '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
                'Imagery © <a href="http://mapbox.com">Mapbox</a>',
            mbUrl = 'https://{s}.tiles.mapbox.com/v3/{id}/{z}/{x}/{y}.png';

        // openstreetmap base layers (greyscale, streets)    
        var grayscale = L.tileLayer(mbUrl, { id: 'examples.map-20v6611k', attribution: mbAttr }),
            streets = L.tileLayer(mbUrl, { id: 'examples.map-i875mjb7', attribution: mbAttr });          
        
        // set default base layer to openstreetmap streets
        this.map = L.map(divID, {
            center: center,
            zoom: zoom,
            layers: [streets],
            scrollWheelZoom: 'center'
        });

        // create basic list of base layers to be inserted in menu 
        this.baseLayers = {           
            "Grayscale": grayscale,
            "Streets": streets
        };

    },

If you want to use Google baselayers (that will make your map look like Google maps), you will need to use a plugin. Inside mapManager, you can find the code and references to use a plugin of my choice: https://github.com/shramov/leaflet-plugins/blob/master/layer/tile/Google.js by Pavel Shramov. 

Another thing you might want to do is adding one or more WMS overlays (L.tileLayer.wms) and finalize your map assigning all the base layers and overlays you previously defined to your map object and inserting them in a user menu (L.control.layers):

JavaScript
// add WMS overlay
addWMSOverlay: function (overlayName, wmsAddress, wmsParams) {
    var layer = L.tileLayer.wms(wmsAddress, wmsParams);
    this.overlays[overlayName] = layer;
},

// assign base layers and overlays to map object, insert them in upper right menu
addLayersControl: function () {
    if (isEmptyJSObj(this.overlays))
        this.mapLayersMenu = L.control.layers(this.baseLayers).addTo(this.map);
    else
        this.mapLayersMenu = L.control.layers(this.baseLayers, this.overlays).addTo(this.map);
},

Finally, you might want to find some nice icons and add custom markers to your map:

JavaScript
// insert markers on the map
// position is array [lat, long]
// iconSize is array [width, height] (pixels)
addMarker: function (relativeIconUrl, position, iconSize, popupHtmlContents) {
    var defaultMapIcon = L.Icon.extend({
        options: {
            iconSize: iconSize,
            iconAnchor: [15, 15],
            popupAnchor: [-3, -3],
        }
    });

    var myMarker = new defaultMapIcon({ iconUrl: getBaseUrl() + relativeIconUrl });
    L.marker(position, { icon: myMarker }).bindPopup(popupHtmlContents).addTo(this.map);
}

Here is an example of how to use my object mapManager to easily build your map with overlays and custom markers:

JavaScript
$( document ).ready(function() {
    CreateMap();
    // add a marker - a scottish flag icon will be shown on the coordinates for 
    // Edinburgh (latitude 55.95, longitude -3.19)
    // the icon size is 30 X 23 (width X height)
    // when clicking on the marker a popup will be shown with the text "Edinburgh!"
    mapManager.addMarker('/includes/images/edinburgh.png', [55.95, -3.19], [30, 23], 'Edinburgh!');
    // London marker
    mapManager.addMarker('/includes/images/london.png', [51.50, -0.12], [30, 18], 'London!');
    // Dublin marker
    mapManager.addMarker('/includes/images/dublin.png', [53.34, -6.26], [30, 19], 'Dublin!');
});

function CreateMap() {
    
    // create and initialize an empty map centered in [53.38, -1.47] (latitude, longitude) with zoom 6
    // map comes with a bunch of base layers (openstreetmap)
    mapManager.init('map', [53.38, -1.47], 6);
   
    // add a WMS (web map service) overlay - this one shows values of 
    // air temperature in different areas (points on the map) 
    mapManager.addWMSOverlay("Air Temp (deg F) - noaa",
       "http://nowcoast.noaa.gov/wms/com.esri.wms.Esrimap/obs", {
           format: "image/png",
           transparent: true,
           layers: "OBS_MET_TEMP"
       });
    //  add a WMS (web map service) overlay - this one shows a heatmap on air temperature
    mapManager.addWMSOverlay("Air Temp (heatmap) - geomet",
       "http://geo.weather.gc.ca/geomet/", {
           format: "image/png",
           transparent: true,
           opacity: 0.5,
           layers: "GDPS.PRES_TT"
       });
    
    // add a basic control panel (menu) in the upper right corner of the map with 
    // base layers and overlays
    mapManager.addLayersControl();   

}

I hope you find mapManager useful!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
United Kingdom United Kingdom
I have been working as a software developer since 2011 and I have so far experienced some different roles and fields: right after graduating in software engineering at the University of Genova (Italy), I started out in the industry as a multimedia developer designing and writing interactive applications in actionScript and c# for touch screen devices inside museums, then I moved to work for a social marketing startup building websites in php+javascript and facebook apps, then I eventually went back to c# (this time ASP.NET) and followed up with javascript working on a website aimed at the visualization of big amounts of scientific georeferenced data.

Comments and Discussions

 
QuestionThank you! Pin
Chris Maunder16-Aug-20 7:34
cofounderChris Maunder16-Aug-20 7:34 
QuestionI see only three country flags when I open the map.html Pin
Member 146093921-Oct-19 4:41
Member 146093921-Oct-19 4:41 
QuestionThanks for the post! Pin
Neil Diffenbaugh18-Mar-15 7:20
Neil Diffenbaugh18-Mar-15 7:20 
GeneralRe: Thanks for the post! Pin
thewazz19-Mar-15 20:09
professionalthewazz19-Mar-15 20:09 
GeneralRe: Thanks for the post! Pin
Dycz19-Mar-15 22:26
professionalDycz19-Mar-15 22:26 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.