add missing territories and the zoom function at counties level
authorymh <ymh.work@gmail.com>
Sat, 17 Dec 2016 23:43:28 +0100
changeset 475 dbb941b9fb66
parent 474 245b4df137d3
child 476 9cffc7f32f14
add missing territories and the zoom function at counties level
cms/app-client/app/components/visu-carto.js
cms/app-client/lib/scripts/prepare_maps.js
cms/app-client/vendor/data/maps/worldLow.js
--- a/cms/app-client/app/components/visu-carto.js	Fri Dec 16 17:43:07 2016 +0100
+++ b/cms/app-client/app/components/visu-carto.js	Sat Dec 17 23:43:28 2016 +0100
@@ -6,204 +6,257 @@
 
 export default Ember.Component.extend({
 
-    constants: Ember.inject.service(),
-    colors: Ember.inject.service(),
+  constants: Ember.inject.service(),
+  colors: Ember.inject.service(),
 
-    map: null,
+  map: null,
 
-    continentsMapVar: AmCharts.maps.continentsLow,
-    continentsAreas: [],
-    countriesMapVar: AmCharts.maps.worldLow,
-    countriesAreas: [],
-    franceMapVar: AmCharts.maps.france2016Low,
-    franceAreas: [],
+  continentsMapVar: AmCharts.maps.continentsLow,
+  continentsAreas: [],
+  countriesMapVar: AmCharts.maps.worldLow,
+  countriesAreas: [],
+  franceMapVar: AmCharts.maps.france2016Low,
+  franceAreas: [],
+
+  dataProvider: {},
+
 
-    dataProvider: {},
+  area: null,
+  originalZoomLevel: null,
+  originalZoomLongitude: null,
+  originalZoomLatitude: null,
 
-    color: 'rgba(113,132,141,.2)',
+  color: 'rgba(113,132,141,.2)',
 
-    filter: Ember.inject.service(),
-    locationObserver: Ember.observer('filter.location', function() {
-        if(this.get('filter').get('location') === null) {
-            this.sendAction('setLocation', this.get('constants').GEONAMES['world']);
-            this.get('map').selectObject();
-        } else {
-            this.sendAction('setLocation', commonUtils.getGeonamesCode(this.get('filter').get('location')));
-        }
-    }),
+  filter: Ember.inject.service(),
+  locationObserver: Ember.observer('filter.location', function () {
+    if (this.get('filter').get('location') === null) {
+      this.sendAction('setLocation', this.get('constants').GEONAMES['world']);
+      this.get('map').selectObject();
+    } else {
+      this.sendAction('setLocation', commonUtils.getGeonamesCode(this.get('filter').get('location')));
+    }
+  }),
 
-    geostats: [],
-    observerGeostats: Ember.observer('geostats', function() {
-        if(this.get('map')) {
-            if(this.get('map').selectedObject.id) {
-                if(this.get('map').selectedObject.parentObject.mapVar === this.get('countriesMapVar')) {
-                    if(this.get('map').selectedObject.id === this.get('constants').GEONAMES['france']) {
-                        this.setFranceAreas();
-                        this.set('dataProvider', {
-                            'mapVar': this.get('franceMapVar'),
-                            'getAreasFromMap': true,
-                            'areas': this.get('franceAreas')
-                        });
-                        this.get('map')['dataProvider'] = this.get('dataProvider');
-                        this.get('map').validateData();
-                    }
-                } else if(this.get('map').selectedObject.parentObject.mapVar === this.get('continentsMapVar')) {
-                    this.setCountriesAreas();
-                    this.set('dataProvider', {
-                        'mapVar': this.get('countriesMapVar'),
-                        'getAreasFromMap': true,
-                        'areas': this.get('countriesAreas'),
-                        'zoomLevel': this.get('map').zoomLevel(),
-                        'zoomLatitude': this.get('map').zoomLatitude(),
-                        'zoomLongitude': this.get('map').zoomLongitude()
-                    });
-                    this.get('map')['dataProvider'] = this.get('dataProvider');
-                    this.get('map').validateData();
-                }
-            } else {
-                this.setContinentsAreas();
-                this.set('dataProvider', {
-                    'mapVar': this.get('continentsMapVar'),
-                    'areas': this.get('continentsAreas')
-                });
-                this.createAmMap();
-            }
+  geostats: [],
+  observerGeostats: Ember.observer('geostats', function () {
+    let map = this.get('map');
+    if(!map) {
+      return;
+    }
+    let selectedObject = map.selectedObject;
+    if (selectedObject.id) {
+      if (selectedObject.parentObject.mapVar === this.get('countriesMapVar')) {
+        if (selectedObject.id === this.get('constants').GEONAMES['france']) {
+          this.setProperties({
+            area: 'france',
+            originalZoomLevel: null,
+            originalZoomLongitude: null,
+            originalZoomLatitude: null,
+          });
+          this.setFranceAreas();
+          this.set('dataProvider', {
+            'mapVar': this.get('franceMapVar'),
+            'getAreasFromMap': true,
+            'areas': this.get('franceAreas')
+          });
+          map['zoomControl'] = {
+            'zoomControlEnabled': false
+          };
+          map['dragMap'] = false;
+          map['dataProvider'] = this.get('dataProvider');
+          map.validateData();
         }
-    }),
-
-    init: function() {
-        this._super(...arguments);
-        if (ENV.environment === 'development') {
-            this.set('color', '#f3f3f3');
-        }
-        this.get('service'); // gotcha cf: https://github.com/emberjs/ember.js/issues/10821
-    },
+      } else if (selectedObject.parentObject.mapVar === this.get('continentsMapVar')) {
+        this.setProperties({
+          area: 'countries',
+          originalZoomLevel: map.zoomLevel(),
+          originalZoomLongitude: map.zoomLongitude(),
+          originalZoomLatitude: map.zoomLatitude()
+        });
 
-    setFranceAreas: function() {
-        var self = this;
-        var france2016LowAreas = [];
-        this.get('franceMapVar')['svg']['g']['path'].forEach(function(area) {
-            var object = {
-                'id': area.id,
-                'passZoomValuesToTarget': false,
-                'autoZoom': false
-            };
-            var departments = self.get('geostats').find(geostat => geostat.id === area.id);
-            if(typeof departments === 'undefined') {
-                object['mouseEnabled'] = false;
-                object['color'] = self.get('color');
-            } else {
-                object['value'] = departments.get('count');
-                object['title'] = area.title + "&nbsp;(" + departments.get('count') + ")";
-            }
-            france2016LowAreas.push(object);
+        this.setCountriesAreas();
+        this.set('dataProvider', {
+          'mapVar': this.get('countriesMapVar'),
+          'getAreasFromMap': true,
+          'areas': this.get('countriesAreas'),
+          'zoomLevel': map.zoomLevel(),
+          'zoomLatitude': map.zoomLatitude(),
+          'zoomLongitude': map.zoomLongitude()
         });
-        this.set('franceAreas', france2016LowAreas);
-    },
+        map['dataProvider'] = this.get('dataProvider');
+        map['zoomControl'] = {
+          'zoomControlEnabled': true
+        };
+        map['dragMap'] = true;
+        map.validateData();
+      }
+    } else {
+      this.setProperties({
+        area: 'continents',
+        originalZoomLevel: null,
+        originalZoomLongitude: null,
+        originalZoomLatitude: null,
+      });
+      this.setContinentsAreas();
+      this.set('dataProvider', {
+        'mapVar': this.get('continentsMapVar'),
+        'areas': this.get('continentsAreas')
+      });
+      map['zoomControl'] = {
+        'zoomControlEnabled': false
+      };
+      map['dragMap'] = false;
+      this.createAmMap();
+    }
+  }),
+
+  init: function () {
+    this._super(...arguments);
+    if (ENV.environment === 'development') {
+      this.set('color', '#f3f3f3');
+    }
+    this.get('service'); // gotcha cf: https://github.com/emberjs/ember.js/issues/10821
+  },
 
-    setCountriesAreas: function() {
-        var self = this;
-        var worldLowAreas = [];
-        this.get('countriesMapVar')['svg']['g']['path'].forEach(function(area) {
-            var countries = self.get('geostats').find(geostat => geostat.id === area.id);
-            if(typeof countries === 'undefined') {
-                worldLowAreas.push({
-                    'id': area.id,
-                    'mouseEnabled': false,
-                    'color': self.get('color')
-                });
-            } else {
-                if(typeof worldLowAreas.find(country => country.id === area.id) === 'undefined') {
-                    var object = {
-                        'id': area.id,
-                        'selectable': true,
-                        'value': countries.get('count'),
-                        'title': area.title + "&nbsp;(" + countries.get('count') + ")"
-                    };
-                    if(area.id === 'FR') {
-                        object['autoZoom'] = true;
-                    }
-                    worldLowAreas.push(object);
-                }
-            }
-        });
-        this.set('countriesAreas', worldLowAreas);
-    },
+  setFranceAreas: function () {
+    var self = this;
+    var france2016LowAreas = [];
+    this.get('franceMapVar')['svg']['g']['path'].forEach(function (area) {
+      var object = {
+        'id': area.id,
+        'passZoomValuesToTarget': false,
+        'autoZoom': false
+      };
+      var departments = self.get('geostats').find(geostat => geostat.id === area.id);
+      if (typeof departments === 'undefined') {
+        object['mouseEnabled'] = false;
+        object['color'] = self.get('color');
+      } else {
+        object['value'] = departments.get('count');
+        object['title'] = area.title + "&nbsp;(" + departments.get('count') + ")";
+      }
+      france2016LowAreas.push(object);
+    });
+    this.set('franceAreas', france2016LowAreas);
+  },
 
-    setContinentsAreas: function() {
-        var self = this;
-        var continentsLowAreas = [];
-        this.get('continentsMapVar')['svg']['g']['path'].forEach(function(area) {
-            var object = {
-                'id': area.id,
-                'passZoomValuesToTarget': true,
-                'selectable': true,
-                'mouseEnabled': true,
-                'autoZoom': true
-            };
-            var continent = self.get('geostats').find(geostat => geostat.id === area.id);
-            if(typeof continent === 'undefined') {
-                object['mouseEnabled'] = false;
-                object['color'] = self.get('color');
-            } else {
-                object['value'] = continent.get('count');
-                object['title'] = area.title + "&nbsp;(" + continent.get('count') + ")";
-            }
-            continentsLowAreas.push(object);
+  setCountriesAreas: function () {
+    var self = this;
+    var worldLowAreas = [];
+    this.get('countriesMapVar')['svg']['g']['path'].forEach(function (area) {
+      var countries = self.get('geostats').find(geostat => geostat.id === area.id);
+      if (typeof countries === 'undefined') {
+        worldLowAreas.push({
+          'id': area.id,
+          'mouseEnabled': false,
+          'color': self.get('color')
         });
-        this.set('continentsAreas', continentsLowAreas);
-    },
+      } else {
+        if (typeof worldLowAreas.find(country => country.id === area.id) === 'undefined') {
+          var object = {
+            'id': area.id,
+            'selectable': true,
+            'value': countries.get('count'),
+            'title': area.title + "&nbsp;(" + countries.get('count') + ")"
+          };
+          if (area.id === 'FR') {
+            object['autoZoom'] = true;
+          }
+          worldLowAreas.push(object);
+        }
+      }
+    });
+    this.set('countriesAreas', worldLowAreas);
+  },
 
-    didInsertElement: function(){
-        this.$('#mapdiv').height(Ember.$('.corpus-app-container').height());
-        this.createAmMap();
-    },
+  setContinentsAreas: function () {
+    var self = this;
+    var continentsLowAreas = [];
+    this.get('continentsMapVar')['svg']['g']['path'].forEach(function (area) {
+      var object = {
+        'id': area.id,
+        'passZoomValuesToTarget': true,
+        'selectable': true,
+        'mouseEnabled': true,
+        'autoZoom': true
+      };
+      var continent = self.get('geostats').find(geostat => geostat.id === area.id);
+      if (typeof continent === 'undefined') {
+        object['mouseEnabled'] = false;
+        object['color'] = self.get('color');
+      } else {
+        object['value'] = continent.get('count');
+        object['title'] = area.title + "&nbsp;(" + continent.get('count') + ")";
+      }
+      continentsLowAreas.push(object);
+    });
+    this.set('continentsAreas', continentsLowAreas);
+  },
 
-    createAmMap: function() {
+  didInsertElement: function () {
+    this.$('#mapdiv').height(Ember.$('.corpus-app-container').height());
+    this.createAmMap();
+  },
+
+  createAmMap: function () {
 
-        this.setContinentsAreas();
-        this.set('dataProvider', {
-            'mapVar': this.get('continentsMapVar'),
-            'areas': this.get('continentsAreas')
-        });
-        this.set('map', AmCharts.makeChart('mapdiv', {
-            'type': 'map',
-            'fontFamily': 'sans-serif',
-            'fontSize': '12px',
-            'dragMap': false,
-            'zoomOnDoubleClick': false,
-            'language': 'fr',
-            'areasSettings': {
-                'autoZoom': false,
-                'selectable': true,
-                'color': this.get('colors').LINEAR_COLOR_START,
-                'colorSolid': this.get('colors').LINEAR_COLOR_END,
-                'colorOutline': '#253946',
-                'selectedColor': '#0085cb',
-                'rollOverColor': '#0085cb',
-                'rollOverOutlineColor': '#ffffff'
-            },
-            'zoomControl': {
-                'zoomControlEnabled': false,
-            },
-            'dataProvider': this.get('dataProvider'),
-            listeners: [{
-                'event':'clickMapObject',
-                'method': Ember.run.bind(this, 'clickMapObject')
-            }, {
-                'event':'homeButtonClicked',
-                'method': Ember.run.bind(this, 'homeButtonClicked')
-            }]
-        }));
-    },
+    this.setContinentsAreas();
+    this.set('dataProvider', {
+      'mapVar': this.get('continentsMapVar'),
+      'areas': this.get('continentsAreas')
+    });
+    this.set('map', AmCharts.makeChart('mapdiv', {
+      'type': 'map',
+      'accessible': true,
+      'fontFamily': 'sans-serif',
+      'fontSize': '12px',
+      'dragMap': false,
+      'zoomOnDoubleClick': false,
+      'language': 'fr',
+      'areasSettings': {
+        'autoZoom': false,
+        'selectable': true,
+        'color': this.get('colors').LINEAR_COLOR_START,
+        'colorSolid': this.get('colors').LINEAR_COLOR_END,
+        'colorOutline': '#253946',
+        'selectedColor': '#0085cb',
+        'rollOverColor': '#0085cb',
+        'rollOverOutlineColor': '#ffffff'
+      },
+      'zoomControl': {
+        'zoomControlEnabled': false,
+      },
+      'dataProvider': this.get('dataProvider'),
+      listeners: [{
+        'event': 'clickMapObject',
+        'method': Ember.run.bind(this, 'clickMapObject')
+      }, {
+        'event': 'homeButtonClicked',
+        'method': Ember.run.bind(this, 'homeButtonClicked')
+      }]
+    }));
+  },
 
-    clickMapObject: function(event) {
-        this.get('filter').setFilter('location', commonConstants.GEONAMES_BASE_URL + event.mapObject.id);
-    },
+  clickMapObject: function (event) {
+    this.get('filter').setFilter('location', commonConstants.GEONAMES_BASE_URL + event.mapObject.id);
+  },
+
+  homeButtonClicked: function () {
+    const map = this.get('map');
+    const { area, originalZoomLevel, originalZoomLongitude, originalZoomLatitude } =
+      this.getProperties('area', 'originalZoomLevel', 'originalZoomLongitude', 'originalZoomLatitude');
 
-    homeButtonClicked: function() {
-        this.get('filter').removeFilter('location', null);
-        this.sendAction('setLocation', this.get('constants').GEONAMES['world']);
+    if(area === 'countries' && (
+      (originalZoomLevel && originalZoomLevel !== map.zoomLevel()) ||
+      (originalZoomLatitude && originalZoomLatitude !== map.zoomLatitude()) ||
+      (originalZoomLongitude && originalZoomLongitude !== map.zoomLongitude())
+    )) {
+      // in mode countries, the map has been moved or zoomed, just reset the view
+      return;
     }
+    this.get('filter').removeFilter('location', null);
+    this.sendAction('setLocation', this.get('constants').GEONAMES['world']);
+  }
 
 });
--- a/cms/app-client/lib/scripts/prepare_maps.js	Fri Dec 16 17:43:07 2016 +0100
+++ b/cms/app-client/lib/scripts/prepare_maps.js	Sat Dec 17 23:43:28 2016 +0100
@@ -87,13 +87,29 @@
   "CS": "8505033", "AN": "8505032"
 }
 
+const missingTerritories = [
+  "PF", //"French Polynesia",
+  "RE", //"Reunion",
+  "YT", //"Mayotte",
+  "MU", //"Mauritius",
+  "WF", //"Wallis and Futuna",
+  "TF", //"French Southern and Antarctic Lands",
+  "MF", //"Saint Martin",
+  "BL", //"Saint Barthelemy",
+  "PM", //"Saint Pierre and Miquelon",
+  "GP", //"Guadeloupe",
+  "MQ", //"Martinique",
+];
+
 global.AmCharts = {'maps': {
   'worldLow': null,
+  'worldHigh': null,
   'continentsLow': null,
   'france2016Low': null
 }};
 
 require(path.join(__dirname,'..','..', 'bower_components/ammap3/ammap/maps/js/worldLow.js'));
+require(path.join(__dirname,'..','..', 'bower_components/ammap3/ammap/maps/js/worldHigh.js'));
 require(path.join(__dirname,'..','..', 'bower_components/ammap3/ammap/maps/js/continentsLow.js'));
 require(path.join(__dirname,'..','..', 'bower_components/ammap3/ammap/maps/js/france2016Low.js'));
 
@@ -108,13 +124,13 @@
     if (!error && resp.statusCode == 200) {
       deferred.resolve(body);
     } else {
-      defaultStatus.reject(error, resp);
+      deferred.reject(error, resp);
     }
   });
   return deferred.promise;
 }
 
-function convert_path_id(map, ids) {
+function convertPathId(map, ids) {
   return Q.all(_.map(map['svg']['g']['path'], (path) => {
     let geonamesId = ids[path['id']];
     return requestq("http://api.geonames.org/getJSON?formatted=true&geonameId="+geonamesId+"&username="+geonamesUsername+"&style=full").then((body)=>{
@@ -134,21 +150,42 @@
   });
 }
 
-convert_path_id(AmCharts.maps.france2016Low, regionsGeonamesIds).then((map)=> {
+function findInMap(id, map) {
+  const resList = _.filter(map['svg']['g']['path'], function(pathDef) {
+    return pathDef.id === id;
+  })
+  return (resList && resList.length)?resList[0]:null;
+}
+
+function copyMissingterritories() {
+  _.each(missingTerritories, function(id) {
+    if(findInMap(id, AmCharts.maps.worldLow) === null) {
+      let pathDef = findInMap(id, AmCharts.maps.worldHigh);
+      if(pathDef !== null) {
+        AmCharts.maps.worldLow['svg']['g']['path'].push(_.cloneDeep(pathDef));
+      }
+    }
+  });
+}
+
+
+copyMissingterritories();
+
+convertPathId(AmCharts.maps.france2016Low, regionsGeonamesIds).then((map)=> {
   fs.writeFileSync(
     path.join(__dirname,'..','..','vendor/data/maps/france2016Low.js'),
     "AmCharts.maps.france2016Low=" + JSON.stringify(map, null, '\t')
   );
 }).done();
 
-convert_path_id(AmCharts.maps.continentsLow, continentGeonamesIds).then((map)=> {
+convertPathId(AmCharts.maps.continentsLow, continentGeonamesIds).then((map)=> {
   fs.writeFileSync(
     path.join(__dirname,'..','..','vendor/data/maps/continentsLow.js'),
     "AmCharts.maps.continentsLow=" + JSON.stringify(map, null, '\t')
   );
 }).done();
 
-convert_path_id(AmCharts.maps.worldLow, contriesGeonamesIds).then((map)=> {
+convertPathId(AmCharts.maps.worldLow, contriesGeonamesIds).then((map)=> {
   fs.writeFileSync(
     path.join(__dirname,'..','..','vendor/data/maps/worldLow.js'),
     "AmCharts.maps.worldLow=" + JSON.stringify(map, null, '\t')
@@ -158,10 +195,10 @@
 
 // fs.writeFileSync(
 //   path.join(__dirname,'..','..','vendor/data/maps/continentsLow.js'),
-//   "AmCharts.maps.continentsLow=" + JSON.stringify(convert_path_id(AmCharts.maps.continentsLow, continentGeonamesIds), null, '\t')
+//   "AmCharts.maps.continentsLow=" + JSON.stringify(convertPathId(AmCharts.maps.continentsLow, continentGeonamesIds), null, '\t')
 // );
 
 // fs.writeFileSync(
 //   path.join(__dirname,'..','..','vendor/data/maps/worldLow.js'),
-//   "AmCharts.maps.worldLow=" + JSON.stringify(convert_path_id(AmCharts.maps.worldLow, contriesGeonamesIds), null, '\t')
+//   "AmCharts.maps.worldLow=" + JSON.stringify(convertPathId(AmCharts.maps.worldLow, contriesGeonamesIds), null, '\t')
 // );
--- a/cms/app-client/vendor/data/maps/worldLow.js	Fri Dec 16 17:43:07 2016 +0100
+++ b/cms/app-client/vendor/data/maps/worldLow.js	Sat Dec 17 23:43:28 2016 +0100
@@ -138,7 +138,7 @@
 				},
 				{
 					"id": "203312",
-					"title": "République démocratique du Congo",
+					"title": "Congo-Kinshasa",
 					"d": "M561.71,453.61L561.54,456.87L562.66,457.24L561.76,458.23L560.68,458.97L559.61,460.43L559.02,461.72L558.86,463.96L558.21,465.02L558.19,467.12L557.38,467.9L557.28,469.56L556.89,469.77L556.63,471.3L557.34,472.56L557.52,475.93L558.02,478.5L557.74,479.96L558.3,481.58L559.93,483.15L561.44,486.7L560.34,486.41L556.57,486.89L555.82,487.22L555.02,489.02L555.65,490.27L555.15,493.62L554.8,496.47L555.56,496.98L557.52,498.08L558.29,497.57L558.53,500.65L556.38,500.62L555.23,499.05L554.2,497.83L552.05,497.43L551.42,495.94L549.7,496.84L547.46,496.44L546.52,495.15L544.74,494.89L543.43,494.96L543.27,494.08L542.3,494.01L541.02,493.84L539.29,494.26L538.07,494.19L537.37,494.45L537.52,491.08L536.59,490.03L536.38,488.3L536.79,486.6L536.23,485.51L536.18,483.75L532.77,483.77L533.02,482.76L531.59,482.77L531.44,483.26L529.7,483.37L528.99,485L528.57,485.71L527.02,485.31L526.1,485.71L524.24,485.93L523.17,484.46L522.53,483.55L521.72,481.87L521.03,479.78L512.76,479.75L511.77,480.08L510.96,480.03L509.8,480.41L509.41,479.54L510.12,479.24L510.21,478.02L510.67,477.3L511.69,476.72L512.43,477L513.39,475.93L514.91,475.96L515.09,476.75L516.14,477.25L517.79,475.49L519.42,474.13L520.13,473.24L520.04,470.94L521.26,468.23L522.54,466.8L524.39,465.46L524.71,464.57L524.78,463.55L525.24,462.58L525.09,461L525.44,458.53L525.99,456.79L526.83,455.3L526.99,453.62L527.24,451.67L528.34,450.25L529.84,449.35L532.15,450.3L533.93,451.33L535.98,451.61L538.07,452.15L538.91,450.47L539.3,450.25L540.57,450.53L543.7,449.14L544.8,449.73L545.71,449.65L546.13,448.97L547.17,448.73L549.28,449.02L551.08,449.08L552.01,448.79L553.7,451.1L554.96,451.43L555.71,450.96L557.01,451.15L558.57,450.56L559.24,451.75z"
 				},
 				{
@@ -890,8 +890,58 @@
 					"id": "878675",
 					"title": "Zimbabwe",
 					"d": "M562.71,527L561.22,526.7L560.27,527.06L558.92,526.55L557.78,526.52L555.99,525.16L553.82,524.7L553,522.8L552.99,521.75L551.79,521.43L548.62,518.18L547.73,516.47L547.17,515.95L546.09,513.6L549.22,513.92L550.13,514.26L551.08,514.19L552.63,512.3L555.07,509.9L556.08,509.68L556.42,508.67L558.01,507.52L560.14,507.12L560.32,508.2L562.66,508.14L563.96,508.75L564.56,509.47L565.9,509.68L567.35,510.62L567.36,514.31L566.81,516.35L566.69,518.55L567.14,519.43L566.83,521.17L566.4,521.44L565.66,523.59z"
+				},
+				{
+					"id": "4030656",
+					"title": "Polynésie Française",
+					"d": "M82.587,487.612l-0.275,0.066l-0.131,-0.012l-0.099,-0.23l0.036,-0.142l0.044,-0.045l0.468,0.056l0.04,0.104l-0.007,0.099L82.587,487.612zM84.037,487.696l-0.182,0.022l-0.03,-0.14l0.056,-0.074l0.078,-0.035l0.139,0.043l0.073,0.061l-0.004,0.052L84.037,487.696zM82.579,489.068l-0.061,0.052l-0.114,-0.169l-0.018,-0.071l0.206,-0.088l0.112,0.046L82.579,489.068zM85.53,489.829l0.42,0.147l0.132,-0.016l-0.134,0.145l-0.419,0.079l-0.139,0.07l-0.169,-0.045l-0.091,-0.168L85.53,489.829zM85.43,490.498l-0.208,0.221l0,-0.235l0.075,-0.031h0.068L85.43,490.498zM86.577,492.152l-0.103,0.048l-0.007,-0.303l0.133,0.058l0.052,0.049l-0.022,0.083L86.577,492.152zM68.615,507.455l-0.018,0.131l-0.053,-0.126l-0.173,-0.202l-0.064,-0.09l0.077,0.014L68.615,507.455zM75.742,508.152l-0.05,0.031l0.064,-0.23l0.072,-0.029L75.742,508.152zM67.393,508.83l0.013,0.05l-0.058,-0.003l-0.104,-0.147l-0.037,-0.127l-0.066,-0.145l-0.091,-0.105l-0.01,-0.097l-0.003,-0.153l0.103,0.234l0.098,0.188l0.071,0.154L67.393,508.83zM50.61,509.784l-0.051,0.022l-0.054,-0.053l-0.023,-0.081l0.019,-0.131l0.136,0.086l0.054,0.058L50.61,509.784zM72.769,509.717l-0.111,0.017l-0.271,-0.173h0.104l0.155,0.108L72.769,509.717zM73.135,509.674l0.153,0.143l-0.203,-0.098l-0.258,-0.042l0.098,-0.026l0.143,0.004L73.135,509.674zM50.77,510.425l-0.111,0.004l-0.101,-0.045l0.025,-0.3l0.027,-0.062l0.156,0.101l0.131,0.262L50.77,510.425zM55.25,512.374l-0.088,0.076l-0.117,-0.054l-0.052,-0.073l-0.019,-0.078l0.027,-0.093l0.262,0.013l0.074,0.041L55.25,512.374zM56.63,512.798l0.404,0.136l0.075,0.221l-0.086,0.147l-0.204,-0.036l-0.101,-0.081l-0.142,-0.264l-0.395,0.06l-0.273,-0.052l-0.151,-0.344l-0.006,-0.156l0.066,-0.095l0.29,-0.104l0.362,0.076l0.138,0.195L56.63,512.798zM80.52,513.286l0.014,0.056l-0.102,-0.007l-0.03,-0.019l0.002,-0.104l0.074,-0.126l0.058,-0.106l0.118,-0.099l0.211,-0.099l0.102,-0.042L81,512.763l-0.039,0.015l-0.349,0.208l-0.109,0.146l-0.048,0.102l0.009,0.032L80.52,513.286zM80.462,514.262l0.02,0.081l-0.105,-0.054l-0.099,-0.149l-0.177,-0.185l-0.042,-0.076l0.136,0.072l0.089,0.108L80.462,514.262zM91.29,514.711l0.001,0.055l-0.27,-0.281l0.106,0.022L91.29,514.711zM80.868,514.822l0.038,0.107l-0.068,-0.05l-0.217,-0.104l-0.024,-0.087L80.868,514.822zM93.192,515.306l-0.057,0.064l-0.005,-0.062l-0.079,-0.03l-0.109,-0.063l-0.148,-0.072l-0.08,-0.012l-0.04,-0.042l0.056,-0.022l0.091,0.033l0.128,0.066l0.148,0.066L93.192,515.306zM86.985,522.16l-0.082,0.056l0.03,-0.076l-0.063,-0.166l-0.062,-0.024l0.062,-0.047l0.088,0.125L86.985,522.16z"
+				},
+				{
+					"id": "935317",
+					"title": "La Réunion",
+					"d": "M632.294,523.602L631.897,523.691L631.621,523.659L631.074,523.405L630.928,523.236L630.71,522.761L630.758,522.594L630.93,522.3L631.32,522.184L631.73,522.227L631.914,522.307L632.131,522.651L632.411,523.001L632.364,523.417z"
+				},
+				{
+					"id": "1024031",
+					"title": "Mayotte",
+					"d": "M602.498,499.163L602.321,499.187L602.238,499.111L602.187,498.931L602.239,498.758L602.254,498.618L602.111,498.375L602.251,498.237L602.37,498.398L602.438,498.409L602.618,498.521L602.565,498.727L602.577,498.795L602.495,499.001z"
+				},
+				{
+					"id": "934292",
+					"title": "Île Maurice",
+					"d": "M637.497,521.05L637.143,521.134L636.745,521.105L636.591,520.946L636.561,520.879L636.694,520.816L636.686,520.611L636.752,520.287L636.837,520.154L637.034,520.035L637.115,519.774L637.285,519.6L637.512,519.578L637.738,519.9L637.892,520.239L637.86,520.58L637.704,520.704L637.652,520.901z"
+				},
+				{
+					"id": "4034749",
+					"title": "Wallis et Futuna",
+					"d": "M991.643,500.183l-0.046,0.023l-0.052,-0.112l0.067,-0.169l0.065,-0.06l0.056,0.133L991.643,500.183zM986.35,503.013l-0.159,0.019l-0.155,-0.038l-0.101,-0.162l0.046,-0.069l0.101,0.032l0.104,0.12l0.172,0.055L986.35,503.013z"
+				},
+				{
+					"id": "3578421",
+					"title": "Saint-Martin (Antilles françaises)",
+					"d": "M298.859,411.432L298.545,411.432L298.568,411.368L298.714,411.296L298.821,411.302L298.864,411.328z"
+				},
+				{
+					"id": "3578476",
+					"title": "Saint-Barthélémy",
+					"d": "M299.363,411.997L299.32,412L299.287,411.976L299.257,411.932L299.24,411.888L299.244,411.862L299.269,411.874L299.453,411.902L299.433,411.935L299.401,411.97z"
+				},
+				{
+					"id": "3424932",
+					"title": "Saint-Pierre-et-Miquelon",
+					"d": "M317.787,314.314l-0.245,0.176l-0.085,-0.098l0.021,-0.116l0.125,-0.279l-0.004,-0.081l-0.148,-0.542l0.025,-0.089l0.037,-0.039l0.217,0.115l0.025,0.148l-0.103,0.333l0.071,0.221l0.096,0.16L317.787,314.314zM318.113,314.625l-0.059,0.039l-0.201,-0.059l0.096,-0.127l0.068,-0.037l0.091,-0.016l0.043,0.039l-0.005,0.094L318.113,314.625z"
+				},
+				{
+					"id": "3579143",
+					"title": "Guadeloupe",
+					"d": "M303.585,416.799l-0.33,0.032l-0.217,-0.025l-0.05,-0.208l0.111,-0.176l-0.08,-0.214l0.051,-0.127l0.111,-0.084l0.182,0.112l0.029,0.16l0.114,0.146l0.513,0.312L303.585,416.799zM302.849,417.448l-0.227,0.13l-0.111,-0.04l-0.138,-0.25l-0.097,-0.694l0.075,-0.115l0.054,-0.043l0.299,0.085l0.125,0.098l0.125,0.062l-0.063,0.127l0.031,0.521L302.849,417.448zM303.857,417.788l-0.156,0.011l-0.069,-0.025l-0.021,-0.174l0.121,-0.12l0.071,-0.029l0.105,0.135l0.025,0.112L303.857,417.788z"
+				},
+				{
+					"id": "3570311",
+					"title": "Martinique",
+					"d": "M304.991,421.82L304.962,421.985L304.891,422.017L304.786,421.88L304.325,421.899L304.254,421.777L304.25,421.719L304.472,421.511L304.211,421.455L304.108,421.365L303.887,420.927L303.905,420.799L303.997,420.732L304.146,420.723L304.428,420.864L304.637,421.066L304.708,421.069L304.732,421.126L304.69,421.268L304.815,421.388L304.869,421.477z"
 				}
 			]
 		}
 	}
-}
+}
\ No newline at end of file