Skip to content

Instantly share code, notes, and snippets.

@UNFPAmaldives
Last active June 21, 2016 19:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save UNFPAmaldives/2fb5fde367cd583b5487544aa529407d to your computer and use it in GitHub Desktop.
Save UNFPAmaldives/2fb5fde367cd583b5487544aa529407d to your computer and use it in GitHub Desktop.
body {
margin: 0;
padding: 0;
}
#map {
position: absolute;
top: 0;
bottom: 0;
width: 100%;
resize: both;
overflow: auto;
}
white-space: nowrap;
}
@font-face {
font-family: 'unfpabold';
src: url("http://unfpamaldives.github.io/migration/css/unfpa-bold-webfont.eot");
}
@font-face {
font-family: 'unfpasemibold';
" src: url("http://unfpamaldives.github.io/migration/css/unfpa-semibold-webfont.eot");
}
@font-face {
font-family: 'unfpatext';
src: url("http://unfpamaldives.github.io/migration/css/unfpa-text-webfont.eot");
}
@font-face {
font-family: 'unfpasemibolditalic';
src: url("http://unfpamaldives.github.io/migration/css/unfpa-semibolditalic-webfont.eot");
}
@font-face {
font-family: 'unfpatextitalic';
src: url("http://unfpamaldives.github.io/migration/css/unfpa-textitalic-webfont.eot");
}
/**
* @author Jawish Hameed <jawish@gmail.com>
* @version 0.1
* @date 20-12-2015
*
*
* Expects the following config:
* var config {
* linkFile = 'data.csv',
* weightMin = 0,
* weightMax = 80,
* lineColorMode = 'fixed', // fixed, random, weight, atoll or a colorname
* lineColorIn = 'red',
* lineColorOut = 'green',
* baseMapProvider = 'esri', // esri, osm
* startLatLng = [3.175, 73.509],
* startZoom = 7
* }
*
*/
var atollLayers = {};
var linkLayers = {};
var atollSelected = null;
// Create map and center around Maldives
var esriMap = L.tileLayer('http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {
attribution: 'Tiles &copy; Esri &mdash; Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community'
});
var osmMap = L.tileLayer('https://services.arcgisonline.com/ArcGIS/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}', {
attribution: 'Tiles &copy; Esri &mdash; Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community'
});
var watercolor = L.tileLayer('http://c.tile.stamen.com/watercolor/{z}/{x}/{y}.jpg', {
attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
});
var map = L.map('map', {
center: config.startLatLng,
zoom: config.startZoom,
layers: [
(config.baseMapProvider == 'esri') ? esriMap : osmMap
]
});
// Load the atolls GeoJSON file
d3.json('atolls.geojson', function(error, atolls) {
if (error) throw error;
var atollLayer = L.geoJson(atolls, {
onEachFeature: function (feature, layer) {
var atollStyle = {
'opacity': 0.1,
'color': null
};
var immigrants = 0,
emigrants = 0;
layer
.setStyle(atollStyle)
.bindLabel(feature.properties.name, { noHide: true })
.on('mouseover', function () {
this.setStyle({
'opacity': 0.9,
'color': 'white'
});
})
.on('mouseout', function () {
this.setStyle(atollStyle);
})
.on('dblclick', function () {
layer.bindPopup('<p3>' + feature.properties.name + '</p3><br><p4>Immigration: ' + immigrants + '</p4><br><p4>Emigration: ' + emigrants + '</p4>').openPopup();
})
.on('click', function (e) {
layer.closePopup();
for (var linkPath in linkLayers) {
var path = linkPath.split('-');
if (atollSelected != null && atollSelected != path[0]) {
map.addLayer(linkLayers[linkPath].feature);
}
}
if (atollSelected == null || atollSelected != feature.id) {
for (var linkPath in linkLayers) {
var path = linkPath.split('-');
if (feature.id != path[0] && feature.id != path[1]) {
map.removeLayer(linkLayers[linkPath].feature);
}
else {
if (feature.id == path[0]) emigrants += parseInt(linkLayers[linkPath].data.value);
if (feature.id == path[1]) immigrants += parseInt(linkLayers[linkPath].data.value);
}
}
atollSelected = feature.id;
}
else {
atollSelected = null;
}
});
atollLayers[feature.id] = {
layer: layer,
center: layer.getBounds().getCenter()
};
},
style: function (feature) {
return {
stroke: 'black',
weight: 1,
opacity: 0.1
}
}
}).addTo(map);
// Check available viz
for (var dataName in config.datasets) {
// Draw buttons
map.addControl(new datasetButton(dataName));
if (config.datasets[dataName].hasOwnProperty('active') && config.datasets[dataName].active == true) {
renderDataset(dataName);
}
}
L.control.layers({}, { 'Terrain': osmMap, 'Satellite': esriMap, 'Watercolor': watercolor }).addTo(map);
});
function renderDataset(dataName) {
for (var linkPath in linkLayers) {
map.removeLayer(linkLayers[linkPath].feature);
}
linkLayers = {};
var vizConfig = config.datasets[dataName];
d3.csv(vizConfig.linkFile, function(error, links) {
if (error) throw error;
var valueMin = d3.min(links, function(l) { return (l.source != l.target) ? parseInt(l.value) : null; });
var valueMax = d3.max(links, function(l) { return (l.source != l.target) ? parseInt(l.value) : null; });
var valueScale = d3.scale.linear()
.domain([valueMin, valueMax])
.range([vizConfig.weightMin, vizConfig.weightMax]);
var atollColors = [];
var colorCategories = d3.scale.category20();
for (var atoll in atollLayers) {
atollColors[atoll] = colorCategories(Object.keys(atollColors).length);
}
var weightColors = d3.scale.ordinal()
.domain([vizConfig.weightMin, (vizConfig.weightMax - vizConfig.weightMin) / 2, vizConfig.weightMax])
.range(['red', 'blue', 'green']);
links.forEach(function (link) {
if (link.source != link.target) {
var path = [ link.source, link.target ].join('-');
var pathReverse = [ link.target, link.source ].join('-');
var lineWeight = valueScale(link.value);
if (vizConfig.hasOwnProperty('skipValueThreshold') && vizConfig.skipValueThreshold > link.value) {
return;
}
if (vizConfig.hasOwnProperty('skipWeightThreshold') && vizConfig.skipValueThreshold > lineWeight) {
return;
}
var lineColor = null;
switch (vizConfig.lineColorMode) {
case 'fixed':
lineColor = (linkLayers.hasOwnProperty(pathReverse)) ? vizConfig.lineColorIn : vizConfig.lineColorOut;
break;
case 'atoll':
lineColor = atollColors[link.source];
break;
case 'weight':
lineColor = weightColors(lineWeight);
break;
case 'random':
lineColor = '#' + Math.floor(Math.random()*16777215).toString(16);
break;
default:
lineColor = vizConfig.lineColorMode;
}
var lineCenterLatLng = L.polyline([ atollLayers[link.source].center, atollLayers[link.target].center ])
.getBounds()
.getCenter();
var lineBreakLatLng = null;
if (linkLayers[pathReverse]) {
lineBreakLatLng = L.latLng(
(lineCenterLatLng.lat * .001) + lineCenterLatLng.lat,
(lineCenterLatLng.lng * .001) + lineCenterLatLng.lng
);
}
else {
lineBreakLatLng = L.latLng(
lineCenterLatLng.lat - (lineCenterLatLng.lat * .001),
lineCenterLatLng.lng - (lineCenterLatLng.lng * .001)
);
}
var line = L.polyline(
[
atollLayers[link.source].center,
lineBreakLatLng,
atollLayers[link.target].center
],
{
color: lineColor,
weight: lineWeight,
smoothFactor: 1,
opacity: 0.5,
fill: false,
class: path
});
var arrow = L.polylineDecorator(line, { patterns: [{
offset: '55%',
symbol: L.Symbol.arrowHead({
polygon: true,
pathOptions: {
weight: lineWeight,
color: lineColor
}
})
}]});
var feature = L.featureGroup([line, arrow])
.bindPopup('<p3>' + link.source + '</p3> to <p3>' + link.target + '</p3>' + '<br>' + '<p4>' + link.value + ' migrants' + '</p4>')
.on('mouseover', function(e) {
if (config.linePopup == 'hover') {
this.openPopup();
}
this.setStyle({
opacity: 1
});
})
.on('mouseout', function(e) {
this.setStyle({
opacity: 0.5
});
})
.addTo(map);
linkLayers[path] = {
feature: feature,
line: line,
arrow: arrow,
data: link
}
}
});
});
}
/**
* Custom control to add a button
*/
var datasetButton = L.Control.extend({
dataName: null,
options: { position: 'topright' },
initialize: function(dataName) {
this.dataName = dataName;
},
onAdd: function (map) {
var self = this;
var container = L.DomUtil.create('div', 'leaflet-bar ');
container.innerText = this.dataName;
container.style.background = '#fff';
container.style.padding = '7px 15px';
container.style.cursor = 'pointer';
container.onclick = function(){
renderDataset(self.dataName);
}
return container;
}
});
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<link href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/leaflet.css" rel="stylesheet" type="text/css"/>
<link href="leaflet.label.css" rel="stylesheet" type="text/css"/>
<link href="app.css" rel="stylesheet" type="text/css"/>
<script>
/* Begin Config */
var config = {
baseMapProvider: 'esri', // Valid values: esri, osm
startLatLng: [3.175, 73.509],
startZoom: 9,
linePopup: 'hover', // Valid values: hover, click
datasets: {
"Male' and atolls": {
linkFile: 'population_sankey_maleandatolls.csv', // data file name (may include path)
weightMin: 1,
weightMax: 30,
lineColorMode: 'fixed', // Valid values: fixed, random, weight, atoll or any color name
lineColorIn: 'orange', // Valid values: any color name
lineColorOut: 'violet', // Valid values: any color name
skipValueThreshold: 1,
skipWeightThreshold: 0,
active: true
},
"To Male'": {
linkFile: 'population_sankey_maleonly.csv', // data file name (may include path)
weightMin: 1,
weightMax: 40,
lineColorMode: 'atoll', // Valid values: fixed, random, weight, atoll or any color name
lineColorIn: 'orange', // Valid values: any color name
lineColorOut: 'violet', // Valid values: any color name
skipValueThreshold: 1,
skipWeightThreshold: 0,
active: false
},
"Among atolls": {
linkFile: 'population_sankey_wo_male.csv', // data file name (may include path)
weightMin: 1,
weightMax: 40,
lineColorMode: 'fixed', // Valid values: fixed, random, weight, atoll or any color name
lineColorIn: 'orange', // Valid values: any color name
lineColorOut: 'violet', // Valid values: any color name
skipValueThreshold: 1,
skipWeightThreshold: 0,
active: false
}
}
};
/* End Config */
</script>
</head>
<body>
<div id="map"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/leaflet.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.9/d3.min.js"></script>
<script src="leaflet-providers.js"></script>
<script src="leaflet.polylinedecorator.min.js"></script>
<script src="leaflet.label.js"></script>
<script src="app.js"></script>
</body>
</html>
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['leaflet'], factory);
} else if (typeof modules === 'object' && module.exports) {
// define a Common JS module that relies on 'leaflet'
module.exports = factory(require('leaflet'));
} else {
// Assume Leaflet is loaded into global object L already
factory(L);
}
}(this, function (L) {
'use strict';
L.TileLayer.Provider = L.TileLayer.extend({
initialize: function (arg, options) {
var providers = L.TileLayer.Provider.providers;
var parts = arg.split('.');
var providerName = parts[0];
var variantName = parts[1];
if (!providers[providerName]) {
throw 'No such provider (' + providerName + ')';
}
var provider = {
url: providers[providerName].url,
options: providers[providerName].options
};
// overwrite values in provider from variant.
if (variantName && 'variants' in providers[providerName]) {
if (!(variantName in providers[providerName].variants)) {
throw 'No such variant of ' + providerName + ' (' + variantName + ')';
}
var variant = providers[providerName].variants[variantName];
var variantOptions;
if (typeof variant === 'string') {
variantOptions = {
variant: variant
};
} else {
variantOptions = variant.options;
}
provider = {
url: variant.url || provider.url,
options: L.Util.extend({}, provider.options, variantOptions)
};
} else if (typeof provider.url === 'function') {
provider.url = provider.url(parts.splice(1, parts.length - 1).join('.'));
}
var forceHTTP = window.location.protocol === 'file:' || provider.options.forceHTTP;
if (provider.url.indexOf('//') === 0 && forceHTTP) {
provider.url = 'http:' + provider.url;
}
// If retina option is set
if (provider.options.retina) {
// Check retina screen
if (options.detectRetina && L.Browser.retina) {
// The retina option will be active now
// But we need to prevent Leaflet retina mode
options.detectRetina = false;
} else {
// No retina, remove option
provider.options.retina = '';
}
}
// replace attribution placeholders with their values from toplevel provider attribution,
// recursively
var attributionReplacer = function (attr) {
if (attr.indexOf('{attribution.') === -1) {
return attr;
}
return attr.replace(/\{attribution.(\w*)\}/,
function (match, attributionName) {
return attributionReplacer(providers[attributionName].options.attribution);
}
);
};
provider.options.attribution = attributionReplacer(provider.options.attribution);
// Compute final options combining provider options with any user overrides
var layerOpts = L.Util.extend({}, provider.options, options);
L.TileLayer.prototype.initialize.call(this, provider.url, layerOpts);
}
});
/**
* Definition of providers.
* see http://leafletjs.com/reference.html#tilelayer for options in the options map.
*/
L.TileLayer.Provider.providers = {
OpenStreetMap: {
url: '//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
options: {
maxZoom: 19,
attribution:
'&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
},
variants: {
Mapnik: {},
BlackAndWhite: {
url: 'http://{s}.tiles.wmflabs.org/bw-mapnik/{z}/{x}/{y}.png',
options: {
maxZoom: 18
}
},
DE: {
url: 'http://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png',
options: {
maxZoom: 18
}
},
France: {
url: 'http://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png',
options: {
attribution: '&copy; Openstreetmap France | {attribution.OpenStreetMap}'
}
},
HOT: {
url: 'http://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',
options: {
attribution: '{attribution.OpenStreetMap}, Tiles courtesy of <a href="http://hot.openstreetmap.org/" target="_blank">Humanitarian OpenStreetMap Team</a>'
}
}
}
},
OpenSeaMap: {
url: 'http://tiles.openseamap.org/seamark/{z}/{x}/{y}.png',
options: {
attribution: 'Map data: &copy; <a href="http://www.openseamap.org">OpenSeaMap</a> contributors'
}
},
OpenTopoMap: {
url: '//{s}.tile.opentopomap.org/{z}/{x}/{y}.png',
options: {
maxZoom: 16,
attribution: 'Map data: {attribution.OpenStreetMap}, <a href="http://viewfinderpanoramas.org">SRTM</a> | Map style: &copy; <a href="https://opentopomap.org">OpenTopoMap</a> (<a href="https://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA</a>)'
}
},
Thunderforest: {
url: '//{s}.tile.thunderforest.com/{variant}/{z}/{x}/{y}.png',
options: {
attribution:
'&copy; <a href="http://www.thunderforest.com/">Thunderforest</a>, {attribution.OpenStreetMap}',
variant: 'cycle'
},
variants: {
OpenCycleMap: 'cycle',
Transport: {
options: {
variant: 'transport',
maxZoom: 19
}
},
TransportDark: {
options: {
variant: 'transport-dark',
maxZoom: 19
}
},
SpinalMap: {
options: {
variant: 'spinal-map',
maxZoom: 11
}
},
Landscape: 'landscape',
Outdoors: 'outdoors',
Pioneer: 'pioneer'
}
},
OpenMapSurfer: {
url: 'http://korona.geog.uni-heidelberg.de/tiles/{variant}/x={x}&y={y}&z={z}',
options: {
maxZoom: 20,
variant: 'roads',
attribution: 'Imagery from <a href="http://giscience.uni-hd.de/">GIScience Research Group @ University of Heidelberg</a> &mdash; Map data {attribution.OpenStreetMap}'
},
variants: {
Roads: 'roads',
AdminBounds: {
options: {
variant: 'adminb',
maxZoom: 19
}
},
Grayscale: {
options: {
variant: 'roadsg',
maxZoom: 19
}
}
}
},
Hydda: {
url: 'http://{s}.tile.openstreetmap.se/hydda/{variant}/{z}/{x}/{y}.png',
options: {
variant: 'full',
attribution: 'Tiles courtesy of <a href="http://openstreetmap.se/" target="_blank">OpenStreetMap Sweden</a> &mdash; Map data {attribution.OpenStreetMap}'
},
variants: {
Full: 'full',
Base: 'base',
RoadsAndLabels: 'roads_and_labels'
}
},
MapQuestOpen: {
/* Mapquest does support https, but with a different subdomain:
* https://otile{s}-s.mqcdn.com/tiles/1.0.0/{type}/{z}/{x}/{y}.{ext}
* which makes implementing protocol relativity impossible.
*/
url: 'http://otile{s}.mqcdn.com/tiles/1.0.0/{type}/{z}/{x}/{y}.{ext}',
options: {
type: 'map',
ext: 'jpg',
attribution:
'Tiles Courtesy of <a href="http://www.mapquest.com/">MapQuest</a> &mdash; ' +
'Map data {attribution.OpenStreetMap}',
subdomains: '1234'
},
variants: {
OSM: {},
Aerial: {
options: {
type: 'sat',
attribution:
'Tiles Courtesy of <a href="http://www.mapquest.com/">MapQuest</a> &mdash; ' +
'Portions Courtesy NASA/JPL-Caltech and U.S. Depart. of Agriculture, Farm Service Agency'
}
},
HybridOverlay: {
options: {
type: 'hyb',
ext: 'png',
opacity: 0.9
}
}
}
},
MapBox: {
url: '//api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}',
options: {
attribution:
'Imagery from <a href="http://mapbox.com/about/maps/">MapBox</a> &mdash; ' +
'Map data {attribution.OpenStreetMap}',
subdomains: 'abcd'
}
},
Stamen: {
url: '//stamen-tiles-{s}.a.ssl.fastly.net/{variant}/{z}/{x}/{y}.{ext}',
options: {
attribution:
'Map tiles by <a href="http://stamen.com">Stamen Design</a>, ' +
'<a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a> &mdash; ' +
'Map data {attribution.OpenStreetMap}',
subdomains: 'abcd',
minZoom: 0,
maxZoom: 20,
variant: 'toner',
ext: 'png'
},
variants: {
Toner: 'toner',
TonerBackground: 'toner-background',
TonerHybrid: 'toner-hybrid',
TonerLines: 'toner-lines',
TonerLabels: 'toner-labels',
TonerLite: 'toner-lite',
Watercolor: {
options: {
variant: 'watercolor',
minZoom: 1,
maxZoom: 16
}
},
Terrain: {
options: {
variant: 'terrain',
minZoom: 4,
maxZoom: 18,
bounds: [[22, -132], [70, -56]]
}
},
TerrainBackground: {
options: {
variant: 'terrain-background',
minZoom: 4,
maxZoom: 18,
bounds: [[22, -132], [70, -56]]
}
},
TopOSMRelief: {
options: {
variant: 'toposm-color-relief',
ext: 'jpg',
bounds: [[22, -132], [51, -56]]
}
},
TopOSMFeatures: {
options: {
variant: 'toposm-features',
bounds: [[22, -132], [51, -56]],
opacity: 0.9
}
}
}
},
Esri: {
url: '//server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}',
options: {
variant: 'World_Street_Map',
attribution: 'Tiles &copy; Esri'
},
variants: {
WorldStreetMap: {
options: {
attribution:
'{attribution.Esri} &mdash; ' +
'Source: Esri, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2012'
}
},
DeLorme: {
options: {
variant: 'Specialty/DeLorme_World_Base_Map',
minZoom: 1,
maxZoom: 11,
attribution: '{attribution.Esri} &mdash; Copyright: &copy;2012 DeLorme'
}
},
WorldTopoMap: {
options: {
variant: 'World_Topo_Map',
attribution:
'{attribution.Esri} &mdash; ' +
'Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community'
}
},
WorldImagery: {
options: {
variant: 'World_Imagery',
attribution:
'{attribution.Esri} &mdash; ' +
'Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community'
}
},
WorldTerrain: {
options: {
variant: 'World_Terrain_Base',
maxZoom: 13,
attribution:
'{attribution.Esri} &mdash; ' +
'Source: USGS, Esri, TANA, DeLorme, and NPS'
}
},
WorldShadedRelief: {
options: {
variant: 'World_Shaded_Relief',
maxZoom: 13,
attribution: '{attribution.Esri} &mdash; Source: Esri'
}
},
WorldPhysical: {
options: {
variant: 'World_Physical_Map',
maxZoom: 8,
attribution: '{attribution.Esri} &mdash; Source: US National Park Service'
}
},
OceanBasemap: {
options: {
variant: 'Ocean_Basemap',
maxZoom: 13,
attribution: '{attribution.Esri} &mdash; Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri'
}
},
NatGeoWorldMap: {
options: {
variant: 'NatGeo_World_Map',
maxZoom: 16,
attribution: '{attribution.Esri} &mdash; National Geographic, Esri, DeLorme, NAVTEQ, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, iPC'
}
},
WorldGrayCanvas: {
options: {
variant: 'Canvas/World_Light_Gray_Base',
maxZoom: 16,
attribution: '{attribution.Esri} &mdash; Esri, DeLorme, NAVTEQ'
}
}
}
},
OpenWeatherMap: {
url: 'http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png',
options: {
maxZoom: 19,
attribution: 'Map data &copy; <a href="http://openweathermap.org">OpenWeatherMap</a>',
opacity: 0.5
},
variants: {
Clouds: 'clouds',
CloudsClassic: 'clouds_cls',
Precipitation: 'precipitation',
PrecipitationClassic: 'precipitation_cls',
Rain: 'rain',
RainClassic: 'rain_cls',
Pressure: 'pressure',
PressureContour: 'pressure_cntr',
Wind: 'wind',
Temperature: 'temp',
Snow: 'snow'
}
},
HERE: {
/*
* HERE maps, formerly Nokia maps.
* These basemaps are free, but you need an API key. Please sign up at
* http://developer.here.com/getting-started
*
* Note that the base urls contain '.cit' whichs is HERE's
* 'Customer Integration Testing' environment. Please remove for production
* envirionments.
*/
url:
'//{s}.{base}.maps.cit.api.here.com/maptile/2.1/' +
'{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?' +
'app_id={app_id}&app_code={app_code}&lg={language}',
options: {
attribution:
'Map &copy; 1987-2014 <a href="http://developer.here.com">HERE</a>',
subdomains: '1234',
mapID: 'newest',
'app_id': '<insert your app_id here>',
'app_code': '<insert your app_code here>',
base: 'base',
variant: 'normal.day',
maxZoom: 20,
type: 'maptile',
language: 'eng',
format: 'png8',
size: '256'
},
variants: {
normalDay: 'normal.day',
normalDayCustom: 'normal.day.custom',
normalDayGrey: 'normal.day.grey',
normalDayMobile: 'normal.day.mobile',
normalDayGreyMobile: 'normal.day.grey.mobile',
normalDayTransit: 'normal.day.transit',
normalDayTransitMobile: 'normal.day.transit.mobile',
normalNight: 'normal.night',
normalNightMobile: 'normal.night.mobile',
normalNightGrey: 'normal.night.grey',
normalNightGreyMobile: 'normal.night.grey.mobile',
basicMap: {
options: {
type: 'basetile'
}
},
mapLabels: {
options: {
type: 'labeltile',
format: 'png'
}
},
trafficFlow: {
options: {
base: 'traffic',
type: 'flowtile'
}
},
carnavDayGrey: 'carnav.day.grey',
hybridDay: {
options: {
base: 'aerial',
variant: 'hybrid.day'
}
},
hybridDayMobile: {
options: {
base: 'aerial',
variant: 'hybrid.day.mobile'
}
},
pedestrianDay: 'pedestrian.day',
pedestrianNight: 'pedestrian.night',
satelliteDay: {
options: {
base: 'aerial',
variant: 'satellite.day'
}
},
terrainDay: {
options: {
base: 'aerial',
variant: 'terrain.day'
}
},
terrainDayMobile: {
options: {
base: 'aerial',
variant: 'terrain.day.mobile'
}
}
}
},
FreeMapSK: {
url: 'http://t{s}.freemap.sk/T/{z}/{x}/{y}.jpeg',
options: {
minZoom: 8,
maxZoom: 16,
subdomains: '1234',
bounds: [[47.204642, 15.996093], [49.830896, 22.576904]],
attribution:
'{attribution.OpenStreetMap}, vizualization CC-By-SA 2.0 <a href="http://freemap.sk">Freemap.sk</a>'
}
},
MtbMap: {
url: 'http://tile.mtbmap.cz/mtbmap_tiles/{z}/{x}/{y}.png',
options: {
attribution:
'{attribution.OpenStreetMap} &amp; USGS'
}
},
CartoDB: {
url: 'http://{s}.basemaps.cartocdn.com/{variant}/{z}/{x}/{y}.png',
options: {
attribution: '{attribution.OpenStreetMap} &copy; <a href="http://cartodb.com/attributions">CartoDB</a>',
subdomains: 'abcd',
maxZoom: 19,
variant: 'light_all'
},
variants: {
Positron: 'light_all',
PositronNoLabels: 'light_nolabels',
PositronOnlyLabels: 'light_only_labels',
DarkMatter: 'dark_all',
DarkMatterNoLabels: 'dark_nolabels',
DarkMatterOnlyLabels: 'dark_only_labels'
}
},
HikeBike: {
url: 'http://{s}.tiles.wmflabs.org/{variant}/{z}/{x}/{y}.png',
options: {
maxZoom: 19,
attribution: '{attribution.OpenStreetMap}',
variant: 'hikebike'
},
variants: {
HikeBike: {},
HillShading: {
options: {
maxZoom: 15,
variant: 'hillshading'
}
}
}
},
BasemapAT: {
url: '//maps{s}.wien.gv.at/basemap/{variant}/normal/google3857/{z}/{y}/{x}.{format}',
options: {
maxZoom: 19,
attribution: 'Datenquelle: <a href="www.basemap.at">basemap.at</a>',
subdomains: ['', '1', '2', '3', '4'],
format: 'png',
bounds: [[46.358770, 8.782379], [49.037872, 17.189532]],
variant: 'geolandbasemap'
},
variants: {
basemap: 'geolandbasemap',
grau: 'bmapgrau',
overlay: 'bmapoverlay',
highdpi: {
options: {
variant: 'bmaphidpi',
format: 'jpeg'
}
},
orthofoto: {
options: {
variant: 'bmaporthofoto30cm',
format: 'jpeg'
}
}
}
},
NASAGIBS: {
url: '//map1.vis.earthdata.nasa.gov/wmts-webmerc/{variant}/default/{time}/{tilematrixset}{maxZoom}/{z}/{y}/{x}.{format}',
options: {
attribution:
'Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System ' +
'(<a href="https://earthdata.nasa.gov">ESDIS</a>) with funding provided by NASA/HQ.',
bounds: [[-85.0511287776, -179.999999975], [85.0511287776, 179.999999975]],
minZoom: 1,
maxZoom: 9,
format: 'jpg',
time: '',
tilematrixset: 'GoogleMapsCompatible_Level'
},
variants: {
ModisTerraTrueColorCR: 'MODIS_Terra_CorrectedReflectance_TrueColor',
ModisTerraBands367CR: 'MODIS_Terra_CorrectedReflectance_Bands367',
ViirsEarthAtNight2012: {
options: {
variant: 'VIIRS_CityLights_2012',
maxZoom: 8
}
},
ModisTerraLSTDay: {
options: {
variant: 'MODIS_Terra_Land_Surface_Temp_Day',
format: 'png',
maxZoom: 7,
opacity: 0.75
}
},
ModisTerraSnowCover: {
options: {
variant: 'MODIS_Terra_Snow_Cover',
format: 'png',
maxZoom: 8,
opacity: 0.75
}
},
ModisTerraAOD: {
options: {
variant: 'MODIS_Terra_Aerosol',
format: 'png',
maxZoom: 6,
opacity: 0.75
}
},
ModisTerraChlorophyll: {
options: {
variant: 'MODIS_Terra_Chlorophyll_A',
format: 'png',
maxZoom: 7,
opacity: 0.75
}
}
}
},
NLS: {
// NLS maps are copyright National library of Scotland.
// http://maps.nls.uk/projects/api/index.html
// Please contact NLS for anything other than non-commercial low volume usage
//
// Map sources: Ordnance Survey 1:1m to 1:63K, 1920s-1940s
// z0-9 - 1:1m
// z10-11 - quarter inch (1:253440)
// z12-18 - one inch (1:63360)
url: '//nls-{s}.tileserver.com/nls/{z}/{x}/{y}.jpg',
options: {
attribution: '<a href="http://geo.nls.uk/maps/">National Library of Scotland Historic Maps</a>',
bounds: [[49.6, -12], [61.7, 3]],
minZoom: 1,
maxZoom: 18,
subdomains: '0123',
}
}
};
L.tileLayer.provider = function (provider, options) {
return new L.TileLayer.Provider(provider, options);
};
return L;
}));
@import url(http://fonts.googleapis.com/css?family=Source+Code+Pro:400,600);
@font-face {
font-family: 'unfpabold';
src: url("http://unfpamaldives.github.io/migration/css/unfpa-bold-webfont.eot");
}
@font-face {
font-family: 'unfpasemibold';
" src: url("http://unfpamaldives.github.io/migration/css/unfpa-semibold-webfont.eot");
}
@font-face {
font-family: 'unfpatext';
src: url("http://unfpamaldives.github.io/migration/css/unfpa-text-webfont.eot");
}
@font-face {
font-family: 'unfpasemibolditalic';
src: url("http://unfpamaldives.github.io/migration/css/unfpa-semibolditalic-webfont.eot");
}
@font-face {
font-family: 'unfpatextitalic';
src: url("http://unfpamaldives.github.io/migration/css/unfpa-textitalic-webfont.eot");
}
p3 {
margin-left: 0;
margin-right: 0;
font: 14px "unfpabold";
font-weight: bold
}
p4 {
margin-left: 0;
margin-right: 0;
font: 14px "unfpatext";
font-weight: normal
}
.leaflet-label {
background: rgb(235, 235, 235);
background: rgba(235, 235, 235, 0.81);
background-clip: padding-box;
border-color: #777;
border-color: rgba(0,0,0,0.25);
border-radius: 4px;
border-style: solid;
border-width: 4px;
color: #111;
display: block;
font: 14px/20px "unfpabold";
padding: 1px 6px;
position: absolute;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
pointer-events: none;
white-space: nowrap;
z-index: 6;
}
.leaflet-label.leaflet-clickable {
cursor: pointer;
pointer-events: auto;
}
.leaflet-label:before,
.leaflet-label:after {
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
content: none;
position: absolute;
top: 5px;
}
.leaflet-label:before {
border-right: 6px solid black;
border-right-color: inherit;
left: -10px;
}
.leaflet-label:after {
border-left: 6px solid black;
border-left-color: inherit;
right: -10px;
}
.leaflet-label-right:before,
.leaflet-label-left:after {
content: "";
}
.leaflet-container {
font: 14px/ "unfpatext";
font-weight: normal
/*
Leaflet.label, a plugin that adds labels to markers and vectors for Leaflet powered maps.
(c) 2012-2013, Jacob Toye, Smartrak
https://github.com/Leaflet/Leaflet.label
http://leafletjs.com
https://github.com/jacobtoye
*/
(function(t){var e=t.L;e.labelVersion="0.2.2-dev",e.Label=(e.Layer?e.Layer:e.Class).extend({includes:e.Mixin.Events,options:{className:"",clickable:!1,direction:"right",noHide:!1,offset:[12,-15],opacity:1,zoomAnimation:!0},initialize:function(t,i){e.setOptions(this,t),this._source=i,this._animated=e.Browser.any3d&&this.options.zoomAnimation,this._isOpen=!1},onAdd:function(t){this._map=t,this._pane=this.options.pane?t._panes[this.options.pane]:this._source instanceof e.Marker?t._panes.markerPane:t._panes.popupPane,this._container||this._initLayout(),this._pane.appendChild(this._container),this._initInteraction(),this._update(),this.setOpacity(this.options.opacity),t.on("moveend",this._onMoveEnd,this).on("viewreset",this._onViewReset,this),this._animated&&t.on("zoomanim",this._zoomAnimation,this),e.Browser.touch&&!this.options.noHide&&(e.DomEvent.on(this._container,"click",this.close,this),t.on("click",this.close,this))},onRemove:function(t){this._pane.removeChild(this._container),t.off({zoomanim:this._zoomAnimation,moveend:this._onMoveEnd,viewreset:this._onViewReset},this),this._removeInteraction(),this._map=null},setLatLng:function(t){return this._latlng=e.latLng(t),this._map&&this._updatePosition(),this},setContent:function(t){return this._previousContent=this._content,this._content=t,this._updateContent(),this},close:function(){var t=this._map;t&&(e.Browser.touch&&!this.options.noHide&&(e.DomEvent.off(this._container,"click",this.close),t.off("click",this.close,this)),t.removeLayer(this))},updateZIndex:function(t){this._zIndex=t,this._container&&this._zIndex&&(this._container.style.zIndex=t)},setOpacity:function(t){this.options.opacity=t,this._container&&e.DomUtil.setOpacity(this._container,t)},_initLayout:function(){this._container=e.DomUtil.create("div","leaflet-label "+this.options.className+" leaflet-zoom-animated"),this.updateZIndex(this._zIndex)},_update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updatePosition(),this._container.style.visibility="")},_updateContent:function(){this._content&&this._map&&this._prevContent!==this._content&&"string"==typeof this._content&&(this._container.innerHTML=this._content,this._prevContent=this._content,this._labelWidth=this._container.offsetWidth)},_updatePosition:function(){var t=this._map.latLngToLayerPoint(this._latlng);this._setPosition(t)},_setPosition:function(t){var i=this._map,n=this._container,o=i.latLngToContainerPoint(i.getCenter()),s=i.layerPointToContainerPoint(t),a=this.options.direction,l=this._labelWidth,h=e.point(this.options.offset);"right"===a||"auto"===a&&s.x<o.x?(e.DomUtil.addClass(n,"leaflet-label-right"),e.DomUtil.removeClass(n,"leaflet-label-left"),t=t.add(h)):(e.DomUtil.addClass(n,"leaflet-label-left"),e.DomUtil.removeClass(n,"leaflet-label-right"),t=t.add(e.point(-h.x-l,h.y))),e.DomUtil.setPosition(n,t)},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPosition(e)},_onMoveEnd:function(){this._animated&&"auto"!==this.options.direction||this._updatePosition()},_onViewReset:function(t){t&&t.hard&&this._update()},_initInteraction:function(){if(this.options.clickable){var t=this._container,i=["dblclick","mousedown","mouseover","mouseout","contextmenu"];e.DomUtil.addClass(t,"leaflet-clickable"),e.DomEvent.on(t,"click",this._onMouseClick,this);for(var n=0;i.length>n;n++)e.DomEvent.on(t,i[n],this._fireMouseEvent,this)}},_removeInteraction:function(){if(this.options.clickable){var t=this._container,i=["dblclick","mousedown","mouseover","mouseout","contextmenu"];e.DomUtil.removeClass(t,"leaflet-clickable"),e.DomEvent.off(t,"click",this._onMouseClick,this);for(var n=0;i.length>n;n++)e.DomEvent.off(t,i[n],this._fireMouseEvent,this)}},_onMouseClick:function(t){this.hasEventListeners(t.type)&&e.DomEvent.stopPropagation(t),this.fire(t.type,{originalEvent:t})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&e.DomEvent.preventDefault(t),"mousedown"!==t.type?e.DomEvent.stopPropagation(t):e.DomEvent.preventDefault(t)}}),e.BaseMarkerMethods={showLabel:function(){return this.label&&this._map&&(this.label.setLatLng(this._latlng),this._map.showLabel(this.label)),this},hideLabel:function(){return this.label&&this.label.close(),this},setLabelNoHide:function(t){this._labelNoHide!==t&&(this._labelNoHide=t,t?(this._removeLabelRevealHandlers(),this.showLabel()):(this._addLabelRevealHandlers(),this.hideLabel()))},bindLabel:function(t,i){var n=this.options.icon?this.options.icon.options.labelAnchor:this.options.labelAnchor,o=e.point(n)||e.point(0,0);return o=o.add(e.Label.prototype.options.offset),i&&i.offset&&(o=o.add(i.offset)),i=e.Util.extend({offset:o},i),this._labelNoHide=i.noHide,this.label||(this._labelNoHide||this._addLabelRevealHandlers(),this.on("remove",this.hideLabel,this).on("move",this._moveLabel,this).on("add",this._onMarkerAdd,this),this._hasLabelHandlers=!0),this.label=new e.Label(i,this).setContent(t),this},unbindLabel:function(){return this.label&&(this.hideLabel(),this.label=null,this._hasLabelHandlers&&(this._labelNoHide||this._removeLabelRevealHandlers(),this.off("remove",this.hideLabel,this).off("move",this._moveLabel,this).off("add",this._onMarkerAdd,this)),this._hasLabelHandlers=!1),this},updateLabelContent:function(t){this.label&&this.label.setContent(t)},getLabel:function(){return this.label},_onMarkerAdd:function(){this._labelNoHide&&this.showLabel()},_addLabelRevealHandlers:function(){this.on("mouseover",this.showLabel,this).on("mouseout",this.hideLabel,this),e.Browser.touch&&this.on("click",this.showLabel,this)},_removeLabelRevealHandlers:function(){this.off("mouseover",this.showLabel,this).off("mouseout",this.hideLabel,this),e.Browser.touch&&this.off("click",this.showLabel,this)},_moveLabel:function(t){this.label.setLatLng(t.latlng)}},e.Icon.Default.mergeOptions({labelAnchor:new e.Point(9,-20)}),e.Marker.mergeOptions({icon:new e.Icon.Default}),e.Marker.include(e.BaseMarkerMethods),e.Marker.include({_originalUpdateZIndex:e.Marker.prototype._updateZIndex,_updateZIndex:function(t){var e=this._zIndex+t;this._originalUpdateZIndex(t),this.label&&this.label.updateZIndex(e)},_originalSetOpacity:e.Marker.prototype.setOpacity,setOpacity:function(t,e){this.options.labelHasSemiTransparency=e,this._originalSetOpacity(t)},_originalUpdateOpacity:e.Marker.prototype._updateOpacity,_updateOpacity:function(){var t=0===this.options.opacity?0:1;this._originalUpdateOpacity(),this.label&&this.label.setOpacity(this.options.labelHasSemiTransparency?this.options.opacity:t)},_originalSetLatLng:e.Marker.prototype.setLatLng,setLatLng:function(t){return this.label&&!this._labelNoHide&&this.hideLabel(),this._originalSetLatLng(t)}}),e.CircleMarker.mergeOptions({labelAnchor:new e.Point(0,0)}),e.CircleMarker.include(e.BaseMarkerMethods),e.Path.include({bindLabel:function(t,i){return this.label&&this.label.options===i||(this.label=new e.Label(i,this)),this.label.setContent(t),this._showLabelAdded||(this.on("mouseover",this._showLabel,this).on("mousemove",this._moveLabel,this).on("mouseout remove",this._hideLabel,this),e.Browser.touch&&this.on("click",this._showLabel,this),this._showLabelAdded=!0),this},unbindLabel:function(){return this.label&&(this._hideLabel(),this.label=null,this._showLabelAdded=!1,this.off("mouseover",this._showLabel,this).off("mousemove",this._moveLabel,this).off("mouseout remove",this._hideLabel,this)),this},updateLabelContent:function(t){this.label&&this.label.setContent(t)},_showLabel:function(t){this.label.setLatLng(t.latlng),this._map.showLabel(this.label)},_moveLabel:function(t){this.label.setLatLng(t.latlng)},_hideLabel:function(){this.label.close()}}),e.Map.include({showLabel:function(t){return this.addLayer(t)}}),e.FeatureGroup.include({clearLayers:function(){return this.unbindLabel(),this.eachLayer(this.removeLayer,this),this},bindLabel:function(t,e){return this.invoke("bindLabel",t,e)},unbindLabel:function(){return this.invoke("unbindLabel")},updateLabelContent:function(t){this.invoke("updateLabelContent",t)}})})(window,document);
L.LineUtil.PolylineDecorator={computeAngle:function(a,b){return 180*Math.atan2(b.y-a.y,b.x-a.x)/Math.PI+90},getPointPathPixelLength:function(a){var b=a.length;if(2>b)return 0;for(var c=0,d=a[0],e=1;e<b;e++)c+=d.distanceTo(d=a[e]);return c},getPixelLength:function(a,b){var c=a instanceof L.Polyline?a.getLatLngs():a,d=c.length;if(2>d)return 0;for(var e=0,f=b.project(c[0]),g=1;g<d;g++)e+=f.distanceTo(f=b.project(c[g]));return e},projectPatternOnPath:function(a,b,c,d){var e=[],f;f=0;for(l=a.length;f<
l;f++)e[f]=d.project(a[f]);a=this.projectPatternOnPointPath(e,b,c);f=0;for(l=a.length;f<l;f++)a[f].latLng=d.unproject(a[f].pt);return a},projectPatternOnPointPath:function(a,b,c){var d=[],e=this.getPointPathPixelLength(a)*c;b=this.interpolateOnPointPath(a,b);d.push(b);if(0<c){a=a.slice(b.predecessor);a[0]=b.pt;for(c=this.getPointPathPixelLength(a);e<=c;)b=this.interpolateOnPointPath(a,e/c),d.push(b),a=a.slice(b.predecessor),a[0]=b.pt,c=this.getPointPathPixelLength(a)}return d},interpolateOnPointPath:function(a,
b){var c=a.length;if(2>c)return null;if(0>=b)return{pt:a[0],predecessor:0,heading:this.computeAngle(a[0],a[1])};if(1<=b)return{pt:a[c-1],predecessor:c-1,heading:this.computeAngle(a[c-2],a[c-1])};if(2==c)return{pt:this.interpolateBetweenPoints(a[0],a[1],b),predecessor:0,heading:this.computeAngle(a[0],a[1])};for(var d=this.getPointPathPixelLength(a),e=a[0],f=e,g=0,h=0,k=0,j=1;j<c&&h<b;j++)e=f,g=h,f=a[j],k+=e.distanceTo(f),h=k/d;return{pt:this.interpolateBetweenPoints(e,f,(b-g)/(h-g)),predecessor:j-
2,heading:this.computeAngle(e,f)}},interpolateBetweenPoints:function(a,b,c){return b.x!=a.x?new L.Point(a.x*(1-c)+c*b.x,a.y*(1-c)+c*b.y):new L.Point(a.x,a.y+(b.y-a.y)*c)}};L.RotatedMarker=L.Marker.extend({options:{angle:0},_setPos:function(a){L.Marker.prototype._setPos.call(this,a);if(L.DomUtil.TRANSFORM)this._icon.style[L.DomUtil.TRANSFORM]+=" rotate("+this.options.angle+"deg)";else if(L.Browser.ie){var b=this.options.angle*L.LatLng.DEG_TO_RAD;a=Math.cos(b);b=Math.sin(b);this._icon.style.filter+=" progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11="+a+", M12="+-b+", M21="+b+", M22="+a+")"}}});
L.rotatedMarker=function(a,b){return new L.RotatedMarker(a,b)};L.Symbol=L.Symbol||{};
L.Symbol.Dash=L.Class.extend({isZoomDependant:!0,options:{pixelSize:10,pathOptions:{}},initialize:function(a){L.Util.setOptions(this,a);this.options.pathOptions.clickable=!1},buildSymbol:function(a,b,c){b=this.options;if(1>=b.pixelSize)return new L.Polyline([a.latLng,a.latLng],b.pathOptions);var d=c.project(a.latLng);a=-(a.heading-90)*L.LatLng.DEG_TO_RAD;a=new L.Point(d.x+b.pixelSize*Math.cos(a+Math.PI)/2,d.y+b.pixelSize*Math.sin(a)/2);d=d.add(d.subtract(a));return new L.Polyline([c.unproject(a),c.unproject(d)],
b.pathOptions)}});L.Symbol.dash=function(a){return new L.Symbol.Dash(a)};
L.Symbol.ArrowHead=L.Class.extend({isZoomDependant:!0,options:{polygon:!0,pixelSize:10,headAngle:60,pathOptions:{stroke:!1,weight:2}},initialize:function(a){L.Util.setOptions(this,a);this.options.pathOptions.clickable=!1},buildSymbol:function(a,b,c){b=this.options;return b.polygon?new L.Polygon(this._buildArrowPath(a,c),b.pathOptions):new L.Polyline(this._buildArrowPath(a,c),b.pathOptions)},_buildArrowPath:function(a,b){var c=b.project(a.latLng),d=-(a.heading-90)*L.LatLng.DEG_TO_RAD,e=this.options.headAngle/
2*L.LatLng.DEG_TO_RAD,f=d+e,d=d-e,f=new L.Point(c.x-this.options.pixelSize*Math.cos(f),c.y+this.options.pixelSize*Math.sin(f)),c=new L.Point(c.x-this.options.pixelSize*Math.cos(d),c.y+this.options.pixelSize*Math.sin(d));return[b.unproject(f),a.latLng,b.unproject(c)]}});L.Symbol.arrowHead=function(a){return new L.Symbol.ArrowHead(a)};
L.Symbol.Marker=L.Class.extend({isZoomDependant:!1,options:{markerOptions:{},rotate:!1},initialize:function(a){L.Util.setOptions(this,a);this.options.markerOptions.clickable=!1;this.options.markerOptions.draggable=!1;this.isZoomDependant=L.Browser.ie&&this.options.rotate},buildSymbol:function(a){return this.options.rotate?(this.options.markerOptions.angle=a.heading,new L.RotatedMarker(a.latLng,this.options.markerOptions)):new L.Marker(a.latLng,this.options.markerOptions)}});L.Symbol.marker=function(a){return new L.Symbol.Marker(a)};L.PolylineDecorator=L.LayerGroup.extend({options:{patterns:[]},initialize:function(a,b){L.LayerGroup.prototype.initialize.call(this);L.Util.setOptions(this,b);this._map=null;this._initPaths(a);this._initPatterns()},_initPaths:function(a){this._paths=[];var b=!1;if(a instanceof L.MultiPolyline||(b=a instanceof L.MultiPolygon)){a=a.getLatLngs();for(var c=0;c<a.length;c++)this._initPath(a[c],b)}else if(a instanceof L.Polyline)this._initPath(a.getLatLngs(),a instanceof L.Polygon);else if(L.Util.isArray(a)&&
0<a.length)if(a[0]instanceof L.Polyline)for(c=0;c<a.length;c++)this._initPath(a[c].getLatLngs(),a[c]instanceof L.Polygon);else this._initPath(a)},_isCoordArray:function(a){return L.Util.isArray(a)&&0<a.length&&(a[0]instanceof L.LatLng||L.Util.isArray(a[0])&&2==a[0].length&&"number"===typeof a[0][0])},_initPath:function(a,b){var c;c=this._isCoordArray(a)?[a]:a;for(var d=0;d<c.length;d++)b&&c[d].push(c[d][0]),this._paths.push(c[d])},_initPatterns:function(){this._isZoomDependant=!1;this._patterns=[];
for(var a,b=0;b<this.options.patterns.length;b++)a=this._parsePatternDef(this.options.patterns[b]),this._patterns.push(a),this._isZoomDependant=this._isZoomDependant||a.isOffsetInPixels||a.isRepeatInPixels||a.symbolFactory.isZoomDependant},setPatterns:function(a){this.options.patterns=a;this._initPatterns();this._softRedraw()},setPaths:function(a){this._initPaths(a);this.redraw()},_parsePatternDef:function(a){var b={cache:[],symbolFactory:a.symbol,isOffsetInPixels:!1,isRepeatInPixels:!1};"string"===
typeof a.offset&&-1!=a.offset.indexOf("%")?b.offset=parseFloat(a.offset)/100:(b.offset=parseFloat(a.offset),b.isOffsetInPixels=0<b.offset);"string"===typeof a.repeat&&-1!=a.repeat.indexOf("%")?b.repeat=parseFloat(a.repeat)/100:(b.repeat=parseFloat(a.repeat),b.isRepeatInPixels=0<b.repeat);return b},onAdd:function(a){this._map=a;this._draw();if(this._isZoomDependant)this._map.on("zoomend",this._softRedraw,this)},onRemove:function(a){this._map.off("zoomend",this._softRedraw,this);this._map=null;L.LayerGroup.prototype.onRemove.call(this,
a)},_buildSymbols:function(a,b,c){for(var d=[],e=0,f=c.length;e<f;e++)d.push(b.buildSymbol(c[e],a,this._map,e,f));return d},_getCache:function(a,b,c){var d=a.cache[b];return"undefined"===typeof d?(a.cache[b]=[],null):d[c]},_getDirectionPoints:function(a,b){var c=this._map.getZoom(),d=this._getCache(b,c,a);if(d)return d;var e;e=null;var f=this._paths[a];b.isOffsetInPixels?(e=L.LineUtil.PolylineDecorator.getPixelLength(f,this._map),d=b.offset/e):d=b.offset;b.isRepeatInPixels?(e=null!==e?e:L.LineUtil.PolylineDecorator.getPixelLength(f,
this._map),e=b.repeat/e):e=b.repeat;d=L.LineUtil.PolylineDecorator.projectPatternOnPath(f,d,e,this._map);return b.cache[c][a]=d},redraw:function(){this._redraw(!0)},_softRedraw:function(){this._redraw(!1)},_redraw:function(a){if(null!==this._map){this.clearLayers();if(a)for(a=0;a<this._patterns.length;a++)this._patterns[a].cache=[];this._draw()}},_drawPattern:function(a){for(var b,c=0;c<this._paths.length;c++){b=this._getDirectionPoints(c,a);b=this._buildSymbols(this._paths[c],a.symbolFactory,b);
for(var d=0;d<b.length;d++)this.addLayer(b[d])}},_draw:function(){for(var a=0;a<this._patterns.length;a++)this._drawPattern(this._patterns[a])}});L.polylineDecorator=function(a,b){return new L.PolylineDecorator(a,b)};
source target value
Malé Malé 54207
Malé Haa Alifu 124
Malé Haa Dhaalu 215
Malé Shaviyani 77
Malé Noonu 127
Malé Raa 134
Malé Baa 141
Malé Lhaviyani 106
Malé Kaafu 783
Malé Alifu Alifu 107
Malé Alifu Dhaalu 181
Malé Vaavu 26
Malé Meemu 77
Malé Faafu 26
Malé Dhaal 100
Malé Thaa 149
Malé Laamu 132
Malé Gaafu Alif 85
Malé Gaaf Dhaalu 147
Malé Gnaviyani 85
Malé Seenu 270
Haa Alifu Malé 5628
Haa Alifu Haa Alifu 12796
Haa Alifu Haa Dhaalu 223
Haa Alifu Shaviyani 28
Haa Alifu Noonu 76
Haa Alifu Raa 55
Haa Alifu Baa 77
Haa Alifu Lhaviyani 73
Haa Alifu Kaafu 732
Haa Alifu Alifu Alifu 112
Haa Alifu Alifu Dhaalu 212
Haa Alifu Vaavu 7
Haa Alifu Meemu 30
Haa Alifu Faafu 11
Haa Alifu Dhaal 63
Haa Alifu Thaa 29
Haa Alifu Laamu 24
Haa Alifu Gaafu Alif 25
Haa Alifu Gaaf Dhaalu 27
Haa Alifu Gnaviyani 9
Haa Alifu Seenu 40
Haa Dhaalu Malé 4582
Haa Dhaalu Haa Alifu 197
Haa Dhaalu Haa Dhaalu 17530
Haa Dhaalu Shaviyani 99
Haa Dhaalu Noonu 66
Haa Dhaalu Raa 55
Haa Dhaalu Baa 99
Haa Dhaalu Lhaviyani 47
Haa Dhaalu Kaafu 948
Haa Dhaalu Alifu Alifu 202
Haa Dhaalu Alifu Dhaalu 208
Haa Dhaalu Vaavu 11
Haa Dhaalu Meemu 37
Haa Dhaalu Faafu 7
Haa Dhaalu Dhaal 52
Haa Dhaalu Thaa 22
Haa Dhaalu Laamu 31
Haa Dhaalu Gaafu Alif 29
Haa Dhaalu Gaaf Dhaalu 31
Haa Dhaalu Gnaviyani 31
Haa Dhaalu Seenu 30
Shaviyani Malé 3077
Shaviyani Haa Alifu 37
Shaviyani Haa Dhaalu 127
Shaviyani Shaviyani 11911
Shaviyani Noonu 101
Shaviyani Raa 53
Shaviyani Baa 100
Shaviyani Lhaviyani 89
Shaviyani Kaafu 403
Shaviyani Alifu Alifu 70
Shaviyani Alifu Dhaalu 139
Shaviyani Vaavu 13
Shaviyani Meemu 14
Shaviyani Faafu 5
Shaviyani Dhaal 43
Shaviyani Thaa 12
Shaviyani Laamu 22
Shaviyani Gaafu Alif 21
Shaviyani Gaaf Dhaalu 8
Shaviyani Gnaviyani 10
Shaviyani Seenu 21
Noonu Malé 3472
Noonu Haa Alifu 50
Noonu Haa Dhaalu 49
Noonu Shaviyani 52
Noonu Noonu 10280
Noonu Raa 65
Noonu Baa 79
Noonu Lhaviyani 272
Noonu Kaafu 411
Noonu Alifu Alifu 43
Noonu Alifu Dhaalu 137
Noonu Vaavu 8
Noonu Meemu 21
Noonu Faafu 1
Noonu Dhaal 31
Noonu Thaa 20
Noonu Laamu 32
Noonu Gaafu Alif 15
Noonu Gaaf Dhaalu 21
Noonu Gnaviyani 6
Noonu Seenu 18
Raa Malé 4842
Raa Haa Alifu 43
Raa Haa Dhaalu 52
Raa Shaviyani 92
Raa Noonu 84
Raa Raa 14694
Raa Baa 200
Raa Lhaviyani 134
Raa Kaafu 391
Raa Alifu Alifu 81
Raa Alifu Dhaalu 103
Raa Vaavu 19
Raa Meemu 16
Raa Faafu 12
Raa Dhaal 40
Raa Thaa 31
Raa Laamu 20
Raa Gaafu Alif 22
Raa Gaaf Dhaalu 7
Raa Gnaviyani 12
Raa Seenu 29
Baa Malé 3673
Baa Haa Alifu 19
Baa Haa Dhaalu 32
Baa Shaviyani 30
Baa Noonu 29
Baa Raa 48
Baa Baa 8690
Baa Lhaviyani 34
Baa Kaafu 274
Baa Alifu Alifu 66
Baa Alifu Dhaalu 79
Baa Vaavu 6
Baa Meemu 15
Baa Faafu 19
Baa Dhaal 17
Baa Thaa 14
Baa Laamu 19
Baa Gaafu Alif 13
Baa Gaaf Dhaalu 22
Baa Gnaviyani 11
Baa Seenu 26
Lhaviyani Malé 3228
Lhaviyani Haa Alifu 27
Lhaviyani Haa Dhaalu 37
Lhaviyani Shaviyani 34
Lhaviyani Noonu 117
Lhaviyani Raa 43
Lhaviyani Baa 83
Lhaviyani Lhaviyani 7624
Lhaviyani Kaafu 348
Lhaviyani Alifu Alifu 44
Lhaviyani Alifu Dhaalu 95
Lhaviyani Vaavu 8
Lhaviyani Meemu 10
Lhaviyani Faafu 9
Lhaviyani Dhaal 18
Lhaviyani Thaa 20
Lhaviyani Laamu 22
Lhaviyani Gaafu Alif 20
Lhaviyani Gaaf Dhaalu 27
Lhaviyani Gnaviyani 13
Lhaviyani Seenu 20
Kaafu Malé 2153
Kaafu Haa Alifu 26
Kaafu Haa Dhaalu 18
Kaafu Shaviyani 19
Kaafu Noonu 25
Kaafu Raa 28
Kaafu Baa 46
Kaafu Lhaviyani 36
Kaafu Kaafu 9612
Kaafu Alifu Alifu 31
Kaafu Alifu Dhaalu 67
Kaafu Vaavu 4
Kaafu Meemu 14
Kaafu Faafu 20
Kaafu Dhaal 23
Kaafu Thaa 15
Kaafu Laamu 18
Kaafu Gaafu Alif 26
Kaafu Gaaf Dhaalu 21
Kaafu Gnaviyani 8
Kaafu Seenu 24
Alifu Alifu Malé 1485
Alifu Alifu Haa Alifu 8
Alifu Alifu Haa Dhaalu 8
Alifu Alifu Shaviyani 11
Alifu Alifu Noonu 14
Alifu Alifu Raa 10
Alifu Alifu Baa 23
Alifu Alifu Lhaviyani 22
Alifu Alifu Kaafu 92
Alifu Alifu Alifu Alifu 5424
Alifu Alifu Alifu Dhaalu 64
Alifu Alifu Vaavu 1
Alifu Alifu Meemu 8
Alifu Alifu Faafu 8
Alifu Alifu Dhaal 6
Alifu Alifu Thaa 6
Alifu Alifu Laamu 9
Alifu Alifu Gaafu Alif 3
Alifu Alifu Gaaf Dhaalu 4
Alifu Alifu Gnaviyani 6
Alifu Alifu Seenu 29
Alifu Dhaalu Malé 1799
Alifu Dhaalu Haa Alifu 15
Alifu Dhaalu Haa Dhaalu 25
Alifu Dhaalu Shaviyani 11
Alifu Dhaalu Noonu 8
Alifu Dhaalu Raa 11
Alifu Dhaalu Baa 19
Alifu Dhaalu Lhaviyani 9
Alifu Dhaalu Kaafu 118
Alifu Dhaalu Alifu Alifu 96
Alifu Dhaalu Alifu Dhaalu 7861
Alifu Dhaalu Vaavu 9
Alifu Dhaalu Meemu 12
Alifu Dhaalu Faafu 13
Alifu Dhaalu Dhaal 14
Alifu Dhaalu Thaa 5
Alifu Dhaalu Laamu 15
Alifu Dhaalu Gaafu Alif 6
Alifu Dhaalu Gaaf Dhaalu 12
Alifu Dhaalu Gnaviyani 1
Alifu Dhaalu Seenu 15
Vaavu Malé 776
Vaavu Haa Alifu 7
Vaavu Haa Dhaalu 5
Vaavu Shaviyani 1
Vaavu Noonu 11
Vaavu Raa 9
Vaavu Baa 13
Vaavu Lhaviyani 3
Vaavu Kaafu 63
Vaavu Alifu Alifu 15
Vaavu Alifu Dhaalu 35
Vaavu Vaavu 1406
Vaavu Meemu 14
Vaavu Faafu 2
Vaavu Dhaal 5
Vaavu Thaa 14
Vaavu Laamu 1
Vaavu Gaafu Alif 0
Vaavu Gaaf Dhaalu 2
Vaavu Gnaviyani 0
Vaavu Seenu 2
Meemu Malé 1857
Meemu Haa Alifu 5
Meemu Haa Dhaalu 18
Meemu Shaviyani 7
Meemu Noonu 26
Meemu Raa 16
Meemu Baa 14
Meemu Lhaviyani 11
Meemu Kaafu 125
Meemu Alifu Alifu 31
Meemu Alifu Dhaalu 67
Meemu Vaavu 5
Meemu Meemu 4486
Meemu Faafu 11
Meemu Dhaal 46
Meemu Thaa 24
Meemu Laamu 13
Meemu Gaafu Alif 12
Meemu Gaaf Dhaalu 11
Meemu Gnaviyani 1
Meemu Seenu 15
Faafu Malé 1092
Faafu Haa Alifu 4
Faafu Haa Dhaalu 6
Faafu Shaviyani 6
Faafu Noonu 3
Faafu Raa 4
Faafu Baa 9
Faafu Lhaviyani 6
Faafu Kaafu 55
Faafu Alifu Alifu 17
Faafu Alifu Dhaalu 31
Faafu Vaavu 5
Faafu Meemu 16
Faafu Faafu 3910
Faafu Dhaal 41
Faafu Thaa 7
Faafu Laamu 10
Faafu Gaafu Alif 6
Faafu Gaaf Dhaalu 16
Faafu Gnaviyani 3
Faafu Seenu 11
Dhaal Malé 1627
Dhaal Haa Alifu 14
Dhaal Haa Dhaalu 13
Dhaal Shaviyani 6
Dhaal Noonu 7
Dhaal Raa 6
Dhaal Baa 7
Dhaal Lhaviyani 0
Dhaal Kaafu 117
Dhaal Alifu Alifu 11
Dhaal Alifu Dhaalu 43
Dhaal Vaavu 2
Dhaal Meemu 24
Dhaal Faafu 17
Dhaal Dhaal 5141
Dhaal Thaa 17
Dhaal Laamu 23
Dhaal Gaafu Alif 7
Dhaal Gaaf Dhaalu 15
Dhaal Gnaviyani 4
Dhaal Seenu 15
Thaa Malé 5014
Thaa Haa Alifu 22
Thaa Haa Dhaalu 26
Thaa Shaviyani 18
Thaa Noonu 32
Thaa Raa 27
Thaa Baa 30
Thaa Lhaviyani 15
Thaa Kaafu 229
Thaa Alifu Alifu 20
Thaa Alifu Dhaalu 60
Thaa Vaavu 5
Thaa Meemu 18
Thaa Faafu 11
Thaa Dhaal 47
Thaa Thaa 8487
Thaa Laamu 86
Thaa Gaafu Alif 19
Thaa Gaaf Dhaalu 20
Thaa Gnaviyani 8
Thaa Seenu 23
Laamu Malé 3160
Laamu Haa Alifu 26
Laamu Haa Dhaalu 22
Laamu Shaviyani 14
Laamu Noonu 27
Laamu Raa 15
Laamu Baa 50
Laamu Lhaviyani 24
Laamu Kaafu 233
Laamu Alifu Alifu 37
Laamu Alifu Dhaalu 79
Laamu Vaavu 12
Laamu Meemu 38
Laamu Faafu 13
Laamu Dhaal 58
Laamu Thaa 125
Laamu Laamu 11380
Laamu Gaafu Alif 47
Laamu Gaaf Dhaalu 34
Laamu Gnaviyani 18
Laamu Seenu 33
Gaafu Alif Malé 4413
Gaafu Alif Haa Alifu 14
Gaafu Alif Haa Dhaalu 9
Gaafu Alif Shaviyani 12
Gaafu Alif Noonu 18
Gaafu Alif Raa 15
Gaafu Alif Baa 33
Gaafu Alif Lhaviyani 15
Gaafu Alif Kaafu 169
Gaafu Alif Alifu Alifu 21
Gaafu Alif Alifu Dhaalu 27
Gaafu Alif Vaavu 4
Gaafu Alif Meemu 9
Gaafu Alif Faafu 13
Gaafu Alif Dhaal 19
Gaafu Alif Thaa 9
Gaafu Alif Laamu 26
Gaafu Alif Gaafu Alif 7904
Gaafu Alif Gaaf Dhaalu 126
Gaafu Alif Gnaviyani 24
Gaafu Alif Seenu 76
Gaaf Dhaalu Malé 6828
Gaaf Dhaalu Haa Alifu 21
Gaaf Dhaalu Haa Dhaalu 37
Gaaf Dhaalu Shaviyani 26
Gaaf Dhaalu Noonu 37
Gaaf Dhaalu Raa 32
Gaaf Dhaalu Baa 66
Gaaf Dhaalu Lhaviyani 41
Gaaf Dhaalu Kaafu 329
Gaaf Dhaalu Alifu Alifu 46
Gaaf Dhaalu Alifu Dhaalu 79
Gaaf Dhaalu Vaavu 10
Gaaf Dhaalu Meemu 23
Gaaf Dhaalu Faafu 20
Gaaf Dhaalu Dhaal 36
Gaaf Dhaalu Thaa 33
Gaaf Dhaalu Laamu 53
Gaaf Dhaalu Gaafu Alif 244
Gaaf Dhaalu Gaaf Dhaalu 10869
Gaaf Dhaalu Gnaviyani 54
Gaaf Dhaalu Seenu 139
Gnaviyani Malé 2330
Gnaviyani Haa Alifu 26
Gnaviyani Haa Dhaalu 15
Gnaviyani Shaviyani 6
Gnaviyani Noonu 38
Gnaviyani Raa 9
Gnaviyani Baa 81
Gnaviyani Lhaviyani 24
Gnaviyani Kaafu 485
Gnaviyani Alifu Alifu 56
Gnaviyani Alifu Dhaalu 160
Gnaviyani Vaavu 5
Gnaviyani Meemu 13
Gnaviyani Faafu 6
Gnaviyani Dhaal 39
Gnaviyani Thaa 17
Gnaviyani Laamu 20
Gnaviyani Gaafu Alif 74
Gnaviyani Gaaf Dhaalu 71
Gnaviyani Gnaviyani 7575
Gnaviyani Seenu 153
Seenu Malé 8302
Seenu Haa Alifu 42
Seenu Haa Dhaalu 41
Seenu Shaviyani 19
Seenu Noonu 79
Seenu Raa 49
Seenu Baa 159
Seenu Lhaviyani 66
Seenu Kaafu 1190
Seenu Alifu Alifu 177
Seenu Alifu Dhaalu 303
Seenu Vaavu 14
Seenu Meemu 22
Seenu Faafu 19
Seenu Dhaal 105
Seenu Thaa 44
Seenu Laamu 57
Seenu Gaafu Alif 118
Seenu Gaaf Dhaalu 126
Seenu Gnaviyani 111
Seenu Seenu 18290
source target value
Malé Malé 54207
Haa Alifu Malé 5628
Haa Dhaalu Malé 4582
Shaviyani Malé 3077
Noonu Malé 3472
Raa Malé 4842
Baa Malé 3673
Lhaviyani Malé 3228
Kaafu Malé 2153
Alifu Alifu Malé 1485
Alifu Dhaalu Malé 1799
Vaavu Malé 776
Meemu Malé 1857
Faafu Malé 1092
Dhaal Malé 1627
Thaa Malé 5014
Laamu Malé 3160
Gaafu Alif Malé 4413
Gaaf Dhaalu Malé 6828
Gnaviyani Malé 2330
Seenu Malé 8302
source target value
Haa Alifu Haa Alifu 12796
Haa Alifu Haa Dhaalu 223
Haa Alifu Shaviyani 28
Haa Alifu Noonu 76
Haa Alifu Raa 55
Haa Alifu Baa 77
Haa Alifu Lhaviyani 73
Haa Alifu Kaafu 732
Haa Alifu Alifu Alifu 112
Haa Alifu Alifu Dhaalu 212
Haa Alifu Vaavu 7
Haa Alifu Meemu 30
Haa Alifu Faafu 11
Haa Alifu Dhaal 63
Haa Alifu Thaa 29
Haa Alifu Laamu 24
Haa Alifu Gaafu Alif 25
Haa Alifu Gaaf Dhaalu 27
Haa Alifu Gnaviyani 9
Haa Alifu Seenu 40
Haa Dhaalu Haa Alifu 197
Haa Dhaalu Haa Dhaalu 17530
Haa Dhaalu Shaviyani 99
Haa Dhaalu Noonu 66
Haa Dhaalu Raa 55
Haa Dhaalu Baa 99
Haa Dhaalu Lhaviyani 47
Haa Dhaalu Kaafu 948
Haa Dhaalu Alifu Alifu 202
Haa Dhaalu Alifu Dhaalu 208
Haa Dhaalu Vaavu 11
Haa Dhaalu Meemu 37
Haa Dhaalu Faafu 7
Haa Dhaalu Dhaal 52
Haa Dhaalu Thaa 22
Haa Dhaalu Laamu 31
Haa Dhaalu Gaafu Alif 29
Haa Dhaalu Gaaf Dhaalu 31
Haa Dhaalu Gnaviyani 31
Haa Dhaalu Seenu 30
Shaviyani Haa Alifu 37
Shaviyani Haa Dhaalu 127
Shaviyani Shaviyani 11911
Shaviyani Noonu 101
Shaviyani Raa 53
Shaviyani Baa 100
Shaviyani Lhaviyani 89
Shaviyani Kaafu 403
Shaviyani Alifu Alifu 70
Shaviyani Alifu Dhaalu 139
Shaviyani Vaavu 13
Shaviyani Meemu 14
Shaviyani Faafu 5
Shaviyani Dhaal 43
Shaviyani Thaa 12
Shaviyani Laamu 22
Shaviyani Gaafu Alif 21
Shaviyani Gaaf Dhaalu 8
Shaviyani Gnaviyani 10
Shaviyani Seenu 21
Noonu Haa Alifu 50
Noonu Haa Dhaalu 49
Noonu Shaviyani 52
Noonu Noonu 10280
Noonu Raa 65
Noonu Baa 79
Noonu Lhaviyani 272
Noonu Kaafu 411
Noonu Alifu Alifu 43
Noonu Alifu Dhaalu 137
Noonu Vaavu 8
Noonu Meemu 21
Noonu Faafu 1
Noonu Dhaal 31
Noonu Thaa 20
Noonu Laamu 32
Noonu Gaafu Alif 15
Noonu Gaaf Dhaalu 21
Noonu Gnaviyani 6
Noonu Seenu 18
Raa Haa Alifu 43
Raa Haa Dhaalu 52
Raa Shaviyani 92
Raa Noonu 84
Raa Raa 14694
Raa Baa 200
Raa Lhaviyani 134
Raa Kaafu 391
Raa Alifu Alifu 81
Raa Alifu Dhaalu 103
Raa Vaavu 19
Raa Meemu 16
Raa Faafu 12
Raa Dhaal 40
Raa Thaa 31
Raa Laamu 20
Raa Gaafu Alif 22
Raa Gaaf Dhaalu 7
Raa Gnaviyani 12
Raa Seenu 29
Baa Haa Alifu 19
Baa Haa Dhaalu 32
Baa Shaviyani 30
Baa Noonu 29
Baa Raa 48
Baa Baa 8690
Baa Lhaviyani 34
Baa Kaafu 274
Baa Alifu Alifu 66
Baa Alifu Dhaalu 79
Baa Vaavu 6
Baa Meemu 15
Baa Faafu 19
Baa Dhaal 17
Baa Thaa 14
Baa Laamu 19
Baa Gaafu Alif 13
Baa Gaaf Dhaalu 22
Baa Gnaviyani 11
Baa Seenu 26
Lhaviyani Haa Alifu 27
Lhaviyani Haa Dhaalu 37
Lhaviyani Shaviyani 34
Lhaviyani Noonu 117
Lhaviyani Raa 43
Lhaviyani Baa 83
Lhaviyani Lhaviyani 7624
Lhaviyani Kaafu 348
Lhaviyani Alifu Alifu 44
Lhaviyani Alifu Dhaalu 95
Lhaviyani Vaavu 8
Lhaviyani Meemu 10
Lhaviyani Faafu 9
Lhaviyani Dhaal 18
Lhaviyani Thaa 20
Lhaviyani Laamu 22
Lhaviyani Gaafu Alif 20
Lhaviyani Gaaf Dhaalu 27
Lhaviyani Gnaviyani 13
Lhaviyani Seenu 20
Kaafu Haa Alifu 26
Kaafu Haa Dhaalu 18
Kaafu Shaviyani 19
Kaafu Noonu 25
Kaafu Raa 28
Kaafu Baa 46
Kaafu Lhaviyani 36
Kaafu Kaafu 9612
Kaafu Alifu Alifu 31
Kaafu Alifu Dhaalu 67
Kaafu Vaavu 4
Kaafu Meemu 14
Kaafu Faafu 20
Kaafu Dhaal 23
Kaafu Thaa 15
Kaafu Laamu 18
Kaafu Gaafu Alif 26
Kaafu Gaaf Dhaalu 21
Kaafu Gnaviyani 8
Kaafu Seenu 24
Alifu Alifu Haa Alifu 8
Alifu Alifu Haa Dhaalu 8
Alifu Alifu Shaviyani 11
Alifu Alifu Noonu 14
Alifu Alifu Raa 10
Alifu Alifu Baa 23
Alifu Alifu Lhaviyani 22
Alifu Alifu Kaafu 92
Alifu Alifu Alifu Alifu 5424
Alifu Alifu Alifu Dhaalu 64
Alifu Alifu Vaavu 1
Alifu Alifu Meemu 8
Alifu Alifu Faafu 8
Alifu Alifu Dhaal 6
Alifu Alifu Thaa 6
Alifu Alifu Laamu 9
Alifu Alifu Gaafu Alif 3
Alifu Alifu Gaaf Dhaalu 4
Alifu Alifu Gnaviyani 6
Alifu Alifu Seenu 29
Alifu Dhaalu Haa Alifu 15
Alifu Dhaalu Haa Dhaalu 25
Alifu Dhaalu Shaviyani 11
Alifu Dhaalu Noonu 8
Alifu Dhaalu Raa 11
Alifu Dhaalu Baa 19
Alifu Dhaalu Lhaviyani 9
Alifu Dhaalu Kaafu 118
Alifu Dhaalu Alifu Alifu 96
Alifu Dhaalu Alifu Dhaalu 7861
Alifu Dhaalu Vaavu 9
Alifu Dhaalu Meemu 12
Alifu Dhaalu Faafu 13
Alifu Dhaalu Dhaal 14
Alifu Dhaalu Thaa 5
Alifu Dhaalu Laamu 15
Alifu Dhaalu Gaafu Alif 6
Alifu Dhaalu Gaaf Dhaalu 12
Alifu Dhaalu Gnaviyani 1
Alifu Dhaalu Seenu 15
Vaavu Haa Alifu 7
Vaavu Haa Dhaalu 5
Vaavu Shaviyani 1
Vaavu Noonu 11
Vaavu Raa 9
Vaavu Baa 13
Vaavu Lhaviyani 3
Vaavu Kaafu 63
Vaavu Alifu Alifu 15
Vaavu Alifu Dhaalu 35
Vaavu Vaavu 1406
Vaavu Meemu 14
Vaavu Faafu 2
Vaavu Dhaal 5
Vaavu Thaa 14
Vaavu Laamu 1
Vaavu Gaafu Alif 0
Vaavu Gaaf Dhaalu 2
Vaavu Gnaviyani 0
Vaavu Seenu 2
Meemu Haa Alifu 5
Meemu Haa Dhaalu 18
Meemu Shaviyani 7
Meemu Noonu 26
Meemu Raa 16
Meemu Baa 14
Meemu Lhaviyani 11
Meemu Kaafu 125
Meemu Alifu Alifu 31
Meemu Alifu Dhaalu 67
Meemu Vaavu 5
Meemu Meemu 4486
Meemu Faafu 11
Meemu Dhaal 46
Meemu Thaa 24
Meemu Laamu 13
Meemu Gaafu Alif 12
Meemu Gaaf Dhaalu 11
Meemu Gnaviyani 1
Meemu Seenu 15
Faafu Haa Alifu 4
Faafu Haa Dhaalu 6
Faafu Shaviyani 6
Faafu Noonu 3
Faafu Raa 4
Faafu Baa 9
Faafu Lhaviyani 6
Faafu Kaafu 55
Faafu Alifu Alifu 17
Faafu Alifu Dhaalu 31
Faafu Vaavu 5
Faafu Meemu 16
Faafu Faafu 3910
Faafu Dhaal 41
Faafu Thaa 7
Faafu Laamu 10
Faafu Gaafu Alif 6
Faafu Gaaf Dhaalu 16
Faafu Gnaviyani 3
Faafu Seenu 11
Dhaal Haa Alifu 14
Dhaal Haa Dhaalu 13
Dhaal Shaviyani 6
Dhaal Noonu 7
Dhaal Raa 6
Dhaal Baa 7
Dhaal Lhaviyani 0
Dhaal Kaafu 117
Dhaal Alifu Alifu 11
Dhaal Alifu Dhaalu 43
Dhaal Vaavu 2
Dhaal Meemu 24
Dhaal Faafu 17
Dhaal Dhaal 5141
Dhaal Thaa 17
Dhaal Laamu 23
Dhaal Gaafu Alif 7
Dhaal Gaaf Dhaalu 15
Dhaal Gnaviyani 4
Dhaal Seenu 15
Thaa Haa Alifu 22
Thaa Haa Dhaalu 26
Thaa Shaviyani 18
Thaa Noonu 32
Thaa Raa 27
Thaa Baa 30
Thaa Lhaviyani 15
Thaa Kaafu 229
Thaa Alifu Alifu 20
Thaa Alifu Dhaalu 60
Thaa Vaavu 5
Thaa Meemu 18
Thaa Faafu 11
Thaa Dhaal 47
Thaa Thaa 8487
Thaa Laamu 86
Thaa Gaafu Alif 19
Thaa Gaaf Dhaalu 20
Thaa Gnaviyani 8
Thaa Seenu 23
Laamu Haa Alifu 26
Laamu Haa Dhaalu 22
Laamu Shaviyani 14
Laamu Noonu 27
Laamu Raa 15
Laamu Baa 50
Laamu Lhaviyani 24
Laamu Kaafu 233
Laamu Alifu Alifu 37
Laamu Alifu Dhaalu 79
Laamu Vaavu 12
Laamu Meemu 38
Laamu Faafu 13
Laamu Dhaal 58
Laamu Thaa 125
Laamu Laamu 11380
Laamu Gaafu Alif 47
Laamu Gaaf Dhaalu 34
Laamu Gnaviyani 18
Laamu Seenu 33
Gaafu Alif Haa Alifu 14
Gaafu Alif Haa Dhaalu 9
Gaafu Alif Shaviyani 12
Gaafu Alif Noonu 18
Gaafu Alif Raa 15
Gaafu Alif Baa 33
Gaafu Alif Lhaviyani 15
Gaafu Alif Kaafu 169
Gaafu Alif Alifu Alifu 21
Gaafu Alif Alifu Dhaalu 27
Gaafu Alif Vaavu 4
Gaafu Alif Meemu 9
Gaafu Alif Faafu 13
Gaafu Alif Dhaal 19
Gaafu Alif Thaa 9
Gaafu Alif Laamu 26
Gaafu Alif Gaafu Alif 7904
Gaafu Alif Gaaf Dhaalu 126
Gaafu Alif Gnaviyani 24
Gaafu Alif Seenu 76
Gaaf Dhaalu Haa Alifu 21
Gaaf Dhaalu Haa Dhaalu 37
Gaaf Dhaalu Shaviyani 26
Gaaf Dhaalu Noonu 37
Gaaf Dhaalu Raa 32
Gaaf Dhaalu Baa 66
Gaaf Dhaalu Lhaviyani 41
Gaaf Dhaalu Kaafu 329
Gaaf Dhaalu Alifu Alifu 46
Gaaf Dhaalu Alifu Dhaalu 79
Gaaf Dhaalu Vaavu 10
Gaaf Dhaalu Meemu 23
Gaaf Dhaalu Faafu 20
Gaaf Dhaalu Dhaal 36
Gaaf Dhaalu Thaa 33
Gaaf Dhaalu Laamu 53
Gaaf Dhaalu Gaafu Alif 244
Gaaf Dhaalu Gaaf Dhaalu 10869
Gaaf Dhaalu Gnaviyani 54
Gaaf Dhaalu Seenu 139
Gnaviyani Haa Alifu 26
Gnaviyani Haa Dhaalu 15
Gnaviyani Shaviyani 6
Gnaviyani Noonu 38
Gnaviyani Raa 9
Gnaviyani Baa 81
Gnaviyani Lhaviyani 24
Gnaviyani Kaafu 485
Gnaviyani Alifu Alifu 56
Gnaviyani Alifu Dhaalu 160
Gnaviyani Vaavu 5
Gnaviyani Meemu 13
Gnaviyani Faafu 6
Gnaviyani Dhaal 39
Gnaviyani Thaa 17
Gnaviyani Laamu 20
Gnaviyani Gaafu Alif 74
Gnaviyani Gaaf Dhaalu 71
Gnaviyani Gnaviyani 7575
Gnaviyani Seenu 153
Seenu Haa Alifu 42
Seenu Haa Dhaalu 41
Seenu Shaviyani 19
Seenu Noonu 79
Seenu Raa 49
Seenu Baa 159
Seenu Lhaviyani 66
Seenu Kaafu 1190
Seenu Alifu Alifu 177
Seenu Alifu Dhaalu 303
Seenu Vaavu 14
Seenu Meemu 22
Seenu Faafu 19
Seenu Dhaal 105
Seenu Thaa 44
Seenu Laamu 57
Seenu Gaafu Alif 118
Seenu Gaaf Dhaalu 126
Seenu Gnaviyani 111
Seenu Seenu 18290
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment