block by andrewxhill 10506396

CartoDB.js Layer Selector

Full Screen

index.html

<!DOCTYPE html>
<html>
  <head>
    <title>Layer selector example | CartoDB.js</title>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <link rel="shortcut icon" href="//cartodb.com/assets/favicon.ico" />
    <style>
      html, body, #map {
        height: 100%;
        padding: 0;
        margin: 0;
        background: black;
      }
 
      #layer_selector {
        position: absolute;
        top: 20px;
        right: 20px;
        padding: 0;
      }
 
      #layer_selector ul {
        padding: 0; margin: 0;
        list-style-type: none;
      }
 
      #layer_selector li {
        border-bottom: 1px solid #999;
        padding: 15px 30px;
        font-family: "Helvetica", Arial;
        font-size: 13px;
        color: #444;
        cursor: auto;
      }
 
      #layer_selector li:hover {
        background-color: #F0F0F0;
        cursor: pointer;
      }
 
      #layer_selector li.selected {
        background-color: #EEE;
      }
    </style>
 
    <link rel="stylesheet" href="//libs.cartocdn.com/cartodb.js/v3/themes/css/cartodb.css" />
    <!--[if lte IE 8]>
        <link rel="stylesheet" href="//libs.cartocdn.com/cartodb.js/v3/themes/css/cartodb.ie.css" />
    <![endif]-->
  </head>
  <body>
    <div id="map"></div>
    <div id="layer_selector" class="cartodb-infobox">
      <ul>
        <li id="abc" class="selected">All</li>
        <li id="efg">Places</li>
        <li id="hij">Cables</li>
      </ul>
    </div>
 
    <!-- include cartodb.js library -->
    <script src="//libs.cartocdn.com/cartodb.js/v3/cartodb.js"></script>
 
    <script>
      var selectedLayer;
      // create layer selector
      function createSelector(layers) {
        var sql = new cartodb.SQL({ user: 'documentation' });
 
        var $options = $('#layer_selector li');
        $options.click(function(e) {
          // get the area of the selected layer
          var $li = $(e.target);
          var layer = $li.attr('id');
          if(selectedLayer != layer ){
            // definitely more elegant ways to do this, but went for
            // ease of understanding
            if (layer == 'abc'){
              layers.getSubLayer(0).show(); // countries
              layers.getSubLayer(1).show(); // cables
              layers.getSubLayer(2).show(); // populated places
            }
            else if (layer == 'efg') {
              layers.getSubLayer(0).show();
              layers.getSubLayer(1).hide();
              layers.getSubLayer(2).show();
            }
            else {
              layers.getSubLayer(0).show();
              layers.getSubLayer(1).show();
              layers.getSubLayer(2).hide();
            }
          }
        });
      }
 
      var layerN = {};
      function main() {
        var map = L.map('map', { 
          zoomControl: true,
          center: [40, -10],
          zoom: 4
        });
        // get the currently selected style
        selectedStyle = $('li.selected').attr('id');
 
        cartodb.createLayer(map, '//osm2.cartodb.com/api/v2/viz/c15905de-c1c3-11e3-a215-0e230854a1cb/viz.json')
        .addTo(map)
        .done(function(layers) {
          createSelector(layers);
        })
        .error(function(err) {
          console.log(err);
        });
      }
 
      window.onload = main;
    </script>
  </body>
</html>