├── .eslintrc.json ├── .gitignore ├── .npmignore ├── .travis.yml ├── CHANGELOG.md ├── README.md ├── docs ├── demo-geojson.html ├── demo-points-icons.html ├── demo-points.html ├── demo-topojson.html ├── demo-vectortiles.html ├── eu-countries.geo.json ├── eu-countries.js ├── eu-countries.topo.json ├── main.css └── vectorgrid-api-docs.html ├── gobblefile.js ├── leafdoc-templates ├── comments.hbs ├── constructor.hbs ├── crs.hbs ├── destructor.hbs ├── event.hbs ├── example.hbs ├── factory.hbs ├── function.hbs ├── html.hbs ├── inherited.hbs ├── method.hbs ├── namespace.hbs ├── option.hbs ├── pane.hbs ├── projection.hbs ├── property.hbs ├── section.hbs └── supersection.hbs ├── package.json ├── src ├── Leaflet.Renderer.Canvas.Tile.js ├── Leaflet.Renderer.SVG.Tile.js ├── Leaflet.VectorGrid.Protobuf.js ├── Leaflet.VectorGrid.Slicer.js ├── Leaflet.VectorGrid.js ├── Symbolizer.Fill.js ├── Symbolizer.Line.js ├── Symbolizer.Point.js ├── Symbolizer.PolyBase.js ├── Symbolizer.js ├── bundle-extra.js ├── bundle.js └── slicerWebWorker.js └── yarn.lock /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "parserOptions": { 3 | "ecmaVersion": 6, 4 | "sourceType": "module" 5 | } 6 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | vendor 3 | npm-debug.log 4 | .gobble-build 5 | dist 6 | .gobble 7 | .gobble-build 8 | .gobble-watch 9 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | vendor 3 | npm-debug.log 4 | .gobble-build 5 | gobblefile.js 6 | aux 7 | .gobble 8 | .gobble-build 9 | yarn.lock 10 | demo 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "node" 4 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 1.3.0 (2017-08-28) 2 | 3 | * Build using Rollup (#29 by @IvanSanchez) 4 | * Remember overridden styles between draw calls (#38 by @perliedman) 5 | * Fix quirks in `setFeatureStyle` (#42 by @lediur) 6 | * Allow points to be styled as icons (#44 by @perliedman) 7 | * Support TMS URLs for protobuf tiles (#47 by @minus34) 8 | * Documentation for styling points as icons (#48 by @frodrigo 9 | * Fix race condition when a tile layer is removed before its tiles have loaded (#57 by @micahcatlin) 10 | * Fix handling of coordinates from GeoJSON points (#32, #62 by @vmeurisse) 11 | * Use standard `for` loops in preference over `for...in` (#27, #70 by @perliedman) 12 | * Clean up map's interactive targets when tiles are removed (#73 by @jkuebart) 13 | * Make features, not tiles, accept pointer events for SVG renderer (#75 by @jkuebart) 14 | * Simplification of style updates (#72 by @jkuebart) 15 | * Port canvas mouse handling fixes from Leaflet `master` to canvas renderer (#78 by @jkuebart) 16 | * Split `FeatureLayer` into `Symbolizers` (by @IvanSanchez) 17 | * Add Leafdoc documentation (by @IvanSanchez) 18 | * Add ability to specify options for `fetch`, adds cookie capability for example (#100 by @tlaitinen) 19 | * Add `setUrl` method to `L.VectorGrid.Protobuf` (#105 by @frodrigo) 20 | 21 | 22 | ## 1.2.0 23 | 24 | * Refactored the code modules into ES6 modules 25 | * Switched the build system and dependencies to use RollupJS 26 | * Store styles set through `setFeatureStyle` so the changes persist after zooming/panning 27 | 28 | ## 1.1.0 29 | 30 | * Support for mouse/pointer events on geometries (by @perliedman) 31 | * Support for point symbolizers as basic `CircleMarker`s (by @perliedman) 32 | 33 | ## 1.0.1 34 | 35 | * Updated dependencies, notably Leaflet 1.0.1. 36 | * Updated build script so Windows users don't hit a 20-year-old legacy filesystem bug (by @LuSilf) 37 | 38 | ## 1.0.0 39 | 40 | * Switch to web workers for most of the heavy lifting (geojson-vt, topojson). 41 | 42 | ## 0.1.2 43 | 44 | * Do not throw errors when trying (and failing) to render points 45 | 46 | ## 0.1.0 47 | 48 | * TopoJSON support 49 | 50 | ## 0.0.0 51 | 52 | * Initial, supprt-buggy release 53 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Leaflet.VectorGrid 4 | 5 | 6 | Display gridded vector data (sliced [GeoJSON](https://geojson.org/), [TopoJSON](https://github.com/mbostock/topojson/wiki) or [protobuf vector tiles](https://github.com/mapbox/vector-tile-spec)) in [Leaflet](https://www.leafletjs.com) 1.0.0 7 | 8 | 9 | ## Demos 10 | 11 | | | | 12 | | --- | --- | 13 | | [`demo-geojson.html`](https://leaflet.github.io/Leaflet.VectorGrid/demo-geojson.html) | Sliced GeoJSON | 14 | | [`demo-topojson.html`](https://leaflet.github.io/Leaflet.VectorGrid/demo-topojson.html) | Sliced TopoJSON (sorry for the antimeridian mess, topojson-to-geojson seems to not handle it properly) | 15 | | [`demo-vectortiles.html`](https://leaflet.github.io/Leaflet.VectorGrid/demo-vectortiles.html) | Protobuf vector tiles: OpenMapTiles, MapBox, MapZen or even ESRI vector tiles | 16 | | [`demo-points.html`](https://leaflet.github.io/Leaflet.VectorGrid/demo-points.html) | Clickable points and lines | 17 | | [`demo-points-icons.html`](https://leaflet.github.io/Leaflet.VectorGrid/demo-points-icons.html) | Points as icons | 18 | 19 | 20 | ## Using 21 | 22 | If you use `npm`: 23 | ``` 24 | npm install leaflet.vectorgrid 25 | ``` 26 | 27 | That will make available two files: `dist/Leaflet.VectorGrid.js` and `dist/Leaflet.VectorGrid.bundled.js`. 28 | 29 | The difference is that `dist/Leaflet.VectorGrid.bundled.js` includes all of `VectorGrid`'s dependencies: 30 | 31 | * [geojson-vt](https://github.com/mapbox/geojson-vt) (Under ISC license) 32 | * [pbf](https://github.com/mapbox/pbf) (Under BSD license) 33 | * [topojson](https://github.com/mbostock/topojson) (Under BSD license) 34 | * [vector-tile](https://github.com/mapbox/vector-tile-js) (Under BSD license) 35 | 36 | If you are adding these dependencies by yourself, use `dist/Leaflet.VectorGrid.js` instead. 37 | 38 | If you don't want to deal with `npm` and local files, you can use `unpkg.com` instead: 39 | 40 | ``` 41 | 42 | ``` 43 | or, with the same caveats about bundled dependencies: 44 | ``` 45 | 46 | ``` 47 | 48 | ## Docs 49 | 50 | This plugin exposes two new classes: 51 | 52 | * `L.VectorGrid.Slicer` for displaying GeoJSON or TopoJSON data 53 | * `L.VectorGrid.Protobuf` for displaying vector tiles from an online tile server 54 | 55 | You can find the API documentation, and the explanation about the styling, at: 56 | 57 | https://leaflet.github.io/Leaflet.VectorGrid/vectorgrid-api-docs.html 58 | 59 | ## Dependencies 60 | 61 | `L.VectorGrid.Slicer` requires `geojson-vt`: the global variable `geojsonvt` must exist. If topojson data is used, then the `topojson` global variable must also exist. 62 | 63 | `L.VectorGrid.Protobuf` requires `vector-tile` and `pbf`: the global variables `VectorTile` and `Pbf` must exist. 64 | 65 | By default, VectorGrid is built with those dependencies bundled. 66 | 67 | ## Developing 68 | 69 | Run `npm install`. 70 | 71 | ## TODO 72 | 73 | * Sub-panes for the tile renderers (to set the "z-index" of layers/features) 74 | * More ``roups in SVG 75 | * Offscreen ``es in Canvas 76 | * `getBounds()` support for the slicer (inherit/extrapolate from geojson data) 77 | * Parser for mapbox-like vector stylesheets 78 | 79 | ## Motivation 80 | 81 | Before VectorGrid, loading vector tiles in Leaflet could only be done with the 82 | Leaflet.MapboxVectorTile or the Hoverboard plugin, but neither of those works with 83 | Leaflet 1.0.0 (or greater). 84 | 85 | VectorGrid leverages the GridLayer feature introduced in Leaflet 1.0.0. 86 | 87 | ## Legalese 88 | 89 | ---------------------------------------------------------------------------- 90 | 91 | "THE BEER-WARE LICENSE": 92 | wrote this file. As long as you retain this notice you 93 | can do whatever you want with this stuff. If we meet some day, and you think 94 | this stuff is worth it, you can buy me a beer in return. 95 | 96 | ---------------------------------------------------------------------------- 97 | 98 | -------------------------------------------------------------------------------- /docs/demo-geojson.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Leaflet.GridLayer.Vector.Slicer demo 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /docs/demo-points-icons.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Leaflet.VectorGrid Points Example 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /docs/demo-points.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Leaflet.VectorGrid Points Example 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /docs/demo-topojson.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Leaflet.GridLayer.Vector.Slicer demo 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /docs/demo-vectortiles.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | VectorGrid.Protobuf example 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 364 | 365 | 366 | -------------------------------------------------------------------------------- /docs/eu-countries.topo.json: -------------------------------------------------------------------------------- 1 | {"type":"Topology","objects":{"eu-countries":{"type":"GeometryCollection","geometries":[ 2 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Albania","sov_a3":"ALB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Albania","adm0_a3":"ALB","geou_dif":0,"geounit":"Albania","gu_a3":"ALB","su_dif":0,"subunit":"Albania","su_a3":"ALB","brk_diff":0,"name":"Albania","name_long":"Albania","brk_a3":"ALB","brk_name":"Albania","brk_group":null,"abbrev":"Alb.","postal":"AL","formal_en":"Republic of Albania","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Albania","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":6,"pop_est":3639453,"gdp_md_est":21810,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"AL","iso_a3":"ALB","iso_n3":"008","un_a3":"008","wb_a2":"AL","wb_a3":"ALB","woe_id":-99,"adm0_a3_is":"ALB","adm0_a3_us":"ALB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[0,1,2,3,4]]}, 3 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Austria","sov_a3":"AUT","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Austria","adm0_a3":"AUT","geou_dif":0,"geounit":"Austria","gu_a3":"AUT","su_dif":0,"subunit":"Austria","su_a3":"AUT","brk_diff":0,"name":"Austria","name_long":"Austria","brk_a3":"AUT","brk_name":"Austria","brk_group":null,"abbrev":"Aust.","postal":"A","formal_en":"Republic of Austria","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Austria","name_alt":null,"mapcolor7":3,"mapcolor8":1,"mapcolor9":3,"mapcolor13":4,"pop_est":8210281,"gdp_md_est":329500,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"AT","iso_a3":"AUT","iso_n3":"040","un_a3":"040","wb_a2":"AT","wb_a3":"AUT","woe_id":-99,"adm0_a3_is":"AUT","adm0_a3_us":"AUT","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[5,6,7,8,9,10,11]]}, 4 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Belgium","sov_a3":"BEL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Belgium","adm0_a3":"BEL","geou_dif":0,"geounit":"Belgium","gu_a3":"BEL","su_dif":0,"subunit":"Belgium","su_a3":"BEL","brk_diff":0,"name":"Belgium","name_long":"Belgium","brk_a3":"BEL","brk_name":"Belgium","brk_group":null,"abbrev":"Belg.","postal":"B","formal_en":"Kingdom of Belgium","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Belgium","name_alt":null,"mapcolor7":3,"mapcolor8":2,"mapcolor9":1,"mapcolor13":8,"pop_est":10414336,"gdp_md_est":389300,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"BE","iso_a3":"BEL","iso_n3":"056","un_a3":"056","wb_a2":"BE","wb_a3":"BEL","woe_id":-99,"adm0_a3_is":"BEL","adm0_a3_us":"BEL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[12,13,14,15,16]]}, 5 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Bulgaria","sov_a3":"BGR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Bulgaria","adm0_a3":"BGR","geou_dif":0,"geounit":"Bulgaria","gu_a3":"BGR","su_dif":0,"subunit":"Bulgaria","su_a3":"BGR","brk_diff":0,"name":"Bulgaria","name_long":"Bulgaria","brk_a3":"BGR","brk_name":"Bulgaria","brk_group":null,"abbrev":"Bulg.","postal":"BG","formal_en":"Republic of Bulgaria","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Bulgaria","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":1,"mapcolor13":8,"pop_est":7204687,"gdp_md_est":93750,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"BG","iso_a3":"BGR","iso_n3":"100","un_a3":"100","wb_a2":"BG","wb_a3":"BGR","woe_id":-99,"adm0_a3_is":"BGR","adm0_a3_us":"BGR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":8,"long_len":8,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[17,18,19,20,21]]}, 6 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Bosnia and Herzegovina","sov_a3":"BIH","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Bosnia and Herzegovina","adm0_a3":"BIH","geou_dif":0,"geounit":"Bosnia and Herzegovina","gu_a3":"BIH","su_dif":0,"subunit":"Bosnia and Herzegovina","su_a3":"BIH","brk_diff":0,"name":"Bosnia and Herz.","name_long":"Bosnia and Herzegovina","brk_a3":"BIH","brk_name":"Bosnia and Herz.","brk_group":null,"abbrev":"B.H.","postal":"BiH","formal_en":"Bosnia and Herzegovina","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Bosnia and Herzegovina","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":1,"mapcolor13":2,"pop_est":4613414,"gdp_md_est":29700,"pop_year":-99,"lastcensus":1991,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"BA","iso_a3":"BIH","iso_n3":"070","un_a3":"070","wb_a2":"BA","wb_a3":"BIH","woe_id":-99,"adm0_a3_is":"BIH","adm0_a3_us":"BIH","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":16,"long_len":22,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[22,23,24]]}, 7 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Belarus","sov_a3":"BLR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Belarus","adm0_a3":"BLR","geou_dif":0,"geounit":"Belarus","gu_a3":"BLR","su_dif":0,"subunit":"Belarus","su_a3":"BLR","brk_diff":0,"name":"Belarus","name_long":"Belarus","brk_a3":"BLR","brk_name":"Belarus","brk_group":null,"abbrev":"Bela.","postal":"BY","formal_en":"Republic of Belarus","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Belarus","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":5,"mapcolor13":11,"pop_est":9648533,"gdp_md_est":114100,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"BY","iso_a3":"BLR","iso_n3":"112","un_a3":"112","wb_a2":"BY","wb_a3":"BLR","woe_id":-99,"adm0_a3_is":"BLR","adm0_a3_us":"BLR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[25,26,27,28,29]]}, 8 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Switzerland","sov_a3":"CHE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Switzerland","adm0_a3":"CHE","geou_dif":0,"geounit":"Switzerland","gu_a3":"CHE","su_dif":0,"subunit":"Switzerland","su_a3":"CHE","brk_diff":0,"name":"Switzerland","name_long":"Switzerland","brk_a3":"CHE","brk_name":"Switzerland","brk_group":null,"abbrev":"Switz.","postal":"CH","formal_en":"Swiss Confederation","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Switzerland","name_alt":null,"mapcolor7":5,"mapcolor8":2,"mapcolor9":7,"mapcolor13":3,"pop_est":7604467,"gdp_md_est":316700,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"CH","iso_a3":"CHE","iso_n3":"756","un_a3":"756","wb_a2":"CH","wb_a3":"CHE","woe_id":-99,"adm0_a3_is":"CHE","adm0_a3_us":"CHE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":11,"long_len":11,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[-9,30,31,32]]}, 9 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Czech Republic","sov_a3":"CZE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Czech Republic","adm0_a3":"CZE","geou_dif":0,"geounit":"Czech Republic","gu_a3":"CZE","su_dif":0,"subunit":"Czech Republic","su_a3":"CZE","brk_diff":0,"name":"Czech Rep.","name_long":"Czech Republic","brk_a3":"CZE","brk_name":"Czech Rep.","brk_group":null,"abbrev":"Cz. Rep.","postal":"CZ","formal_en":"Czech Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Czech Republic","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":2,"mapcolor13":6,"pop_est":10211904,"gdp_md_est":265200,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"CZ","iso_a3":"CZE","iso_n3":"203","un_a3":"203","wb_a2":"CZ","wb_a3":"CZE","woe_id":-99,"adm0_a3_is":"CZE","adm0_a3_us":"CZE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":10,"long_len":14,"abbrev_len":8,"tiny":-99,"homepart":1},"arcs":[[-11,33,34,35]]}, 10 | {"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Denmark","sov_a3":"DN1","adm0_dif":1,"level":2,"type":"Country","admin":"Denmark","adm0_a3":"DNK","geou_dif":0,"geounit":"Denmark","gu_a3":"DNK","su_dif":0,"subunit":"Denmark","su_a3":"DNK","brk_diff":0,"name":"Denmark","name_long":"Denmark","brk_a3":"DNK","brk_name":"Denmark","brk_group":null,"abbrev":"Den.","postal":"DK","formal_en":"Kingdom of Denmark","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Denmark","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":3,"mapcolor13":12,"pop_est":5500510,"gdp_md_est":203600,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"DK","iso_a3":"DNK","iso_n3":"208","un_a3":"208","wb_a2":"DK","wb_a3":"DNK","woe_id":-99,"adm0_a3_is":"DNK","adm0_a3_us":"DNK","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[36]],[[37,38]]]}, 11 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Germany","sov_a3":"DEU","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Germany","adm0_a3":"DEU","geou_dif":0,"geounit":"Germany","gu_a3":"DEU","su_dif":0,"subunit":"Germany","su_a3":"DEU","brk_diff":0,"name":"Germany","name_long":"Germany","brk_a3":"DEU","brk_name":"Germany","brk_group":null,"abbrev":"Ger.","postal":"D","formal_en":"Federal Republic of Germany","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Germany","name_alt":null,"mapcolor7":2,"mapcolor8":5,"mapcolor9":5,"mapcolor13":1,"pop_est":82329758,"gdp_md_est":2918000,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"1. Developed region: G7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"DE","iso_a3":"DEU","iso_n3":"276","un_a3":"276","wb_a2":"DE","wb_a3":"DEU","woe_id":-99,"adm0_a3_is":"DEU","adm0_a3_us":"DEU","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[39,40,-34,-10,-33,41,42,-14,43,44,-38]]}, 12 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Spain","sov_a3":"ESP","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Spain","adm0_a3":"ESP","geou_dif":0,"geounit":"Spain","gu_a3":"ESP","su_dif":0,"subunit":"Spain","su_a3":"ESP","brk_diff":0,"name":"Spain","name_long":"Spain","brk_a3":"ESP","brk_name":"Spain","brk_group":null,"abbrev":"Sp.","postal":"E","formal_en":"Kingdom of Spain","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Spain","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":5,"mapcolor13":5,"pop_est":40525002,"gdp_md_est":1403000,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"ES","iso_a3":"ESP","iso_n3":"724","un_a3":"724","wb_a2":"ES","wb_a3":"ESP","woe_id":-99,"adm0_a3_is":"ESP","adm0_a3_us":"ESP","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":5,"long_len":5,"abbrev_len":3,"tiny":-99,"homepart":1},"arcs":[[45,46,47,48]]}, 13 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Estonia","sov_a3":"EST","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Estonia","adm0_a3":"EST","geou_dif":0,"geounit":"Estonia","gu_a3":"EST","su_dif":0,"subunit":"Estonia","su_a3":"EST","brk_diff":0,"name":"Estonia","name_long":"Estonia","brk_a3":"EST","brk_name":"Estonia","brk_group":null,"abbrev":"Est.","postal":"EST","formal_en":"Republic of Estonia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Estonia","name_alt":null,"mapcolor7":3,"mapcolor8":2,"mapcolor9":1,"mapcolor13":10,"pop_est":1299371,"gdp_md_est":27410,"pop_year":-99,"lastcensus":2000,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"EE","iso_a3":"EST","iso_n3":"233","un_a3":"233","wb_a2":"EE","wb_a3":"EST","woe_id":-99,"adm0_a3_is":"EST","adm0_a3_us":"EST","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[49,50,51]]}, 14 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Finland","sov_a3":"FI1","adm0_dif":1,"level":2,"type":"Country","admin":"Finland","adm0_a3":"FIN","geou_dif":0,"geounit":"Finland","gu_a3":"FIN","su_dif":0,"subunit":"Finland","su_a3":"FIN","brk_diff":0,"name":"Finland","name_long":"Finland","brk_a3":"FIN","brk_name":"Finland","brk_group":null,"abbrev":"Fin.","postal":"FIN","formal_en":"Republic of Finland","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Finland","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":4,"mapcolor13":6,"pop_est":5250275,"gdp_md_est":193500,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"FI","iso_a3":"FIN","iso_n3":"246","un_a3":"246","wb_a2":"FI","wb_a3":"FIN","woe_id":-99,"adm0_a3_is":"FIN","adm0_a3_us":"FIN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[52,53,54,55]]}, 15 | {"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"France","sov_a3":"FR1","adm0_dif":1,"level":2,"type":"Country","admin":"France","adm0_a3":"FRA","geou_dif":0,"geounit":"France","gu_a3":"FRA","su_dif":0,"subunit":"France","su_a3":"FRA","brk_diff":0,"name":"France","name_long":"France","brk_a3":"FRA","brk_name":"France","brk_group":null,"abbrev":"Fr.","postal":"F","formal_en":"French Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"France","name_alt":null,"mapcolor7":7,"mapcolor8":5,"mapcolor9":9,"mapcolor13":11,"pop_est":64057792,"gdp_md_est":2128000,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"1. Developed region: G7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"FR","iso_a3":"FRA","iso_n3":"250","un_a3":"250","wb_a2":"FR","wb_a3":"FRA","woe_id":-99,"adm0_a3_is":"FRA","adm0_a3_us":"FRA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":3,"tiny":-99,"homepart":1},"arcs":[[[56]],[[57]],[[58,-42,-32,59,60,-47,61,-16]]]}, 16 | {"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Country","admin":"United Kingdom","adm0_a3":"GBR","geou_dif":0,"geounit":"United Kingdom","gu_a3":"GBR","su_dif":0,"subunit":"United Kingdom","su_a3":"GBR","brk_diff":0,"name":"United Kingdom","name_long":"United Kingdom","brk_a3":"GBR","brk_name":"United Kingdom","brk_group":null,"abbrev":"U.K.","postal":"GB","formal_en":"United Kingdom of Great Britain and Northern Ireland","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"United Kingdom","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":62262000,"gdp_md_est":1977704,"pop_year":0,"lastcensus":2011,"gdp_year":2009,"economy":"1. Developed region: G7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"GB","iso_a3":"GBR","iso_n3":"826","un_a3":"826","wb_a2":"GB","wb_a3":"GBR","woe_id":-99,"adm0_a3_is":"GBR","adm0_a3_us":"GBR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":14,"long_len":14,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[62,63]],[[64]]]}, 17 | {"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Greece","sov_a3":"GRC","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Greece","adm0_a3":"GRC","geou_dif":0,"geounit":"Greece","gu_a3":"GRC","su_dif":0,"subunit":"Greece","su_a3":"GRC","brk_diff":0,"name":"Greece","name_long":"Greece","brk_a3":"GRC","brk_name":"Greece","brk_group":null,"abbrev":"Greece","postal":"GR","formal_en":"Hellenic Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Greece","name_alt":null,"mapcolor7":2,"mapcolor8":2,"mapcolor9":2,"mapcolor13":9,"pop_est":10737428,"gdp_md_est":343000,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"GR","iso_a3":"GRC","iso_n3":"300","un_a3":"300","wb_a2":"GR","wb_a3":"GRC","woe_id":-99,"adm0_a3_is":"GRC","adm0_a3_us":"GRC","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[65]],[[-2,66,-20,67]]]}, 18 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Croatia","sov_a3":"HRV","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Croatia","adm0_a3":"HRV","geou_dif":0,"geounit":"Croatia","gu_a3":"HRV","su_dif":0,"subunit":"Croatia","su_a3":"HRV","brk_diff":0,"name":"Croatia","name_long":"Croatia","brk_a3":"HRV","brk_name":"Croatia","brk_group":null,"abbrev":"Cro.","postal":"HR","formal_en":"Republic of Croatia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Croatia","name_alt":null,"mapcolor7":5,"mapcolor8":4,"mapcolor9":5,"mapcolor13":1,"pop_est":4489409,"gdp_md_est":82390,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"HR","iso_a3":"HRV","iso_n3":"191","un_a3":"191","wb_a2":"HR","wb_a3":"HRV","woe_id":-99,"adm0_a3_is":"HRV","adm0_a3_us":"HRV","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[68,-25,69,70,71,72]]}, 19 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Hungary","sov_a3":"HUN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Hungary","adm0_a3":"HUN","geou_dif":0,"geounit":"Hungary","gu_a3":"HUN","su_dif":0,"subunit":"Hungary","su_a3":"HUN","brk_diff":0,"name":"Hungary","name_long":"Hungary","brk_a3":"HUN","brk_name":"Hungary","brk_group":null,"abbrev":"Hun.","postal":"HU","formal_en":"Republic of Hungary","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Hungary","name_alt":null,"mapcolor7":4,"mapcolor8":6,"mapcolor9":1,"mapcolor13":5,"pop_est":9905596,"gdp_md_est":196600,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"HU","iso_a3":"HUN","iso_n3":"348","un_a3":"348","wb_a2":"HU","wb_a3":"HUN","woe_id":-99,"adm0_a3_is":"HUN","adm0_a3_us":"HUN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-6,73,74,75,76,-73,77]]}, 20 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Ireland","sov_a3":"IRL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Ireland","adm0_a3":"IRL","geou_dif":0,"geounit":"Ireland","gu_a3":"IRL","su_dif":0,"subunit":"Ireland","su_a3":"IRL","brk_diff":0,"name":"Ireland","name_long":"Ireland","brk_a3":"IRL","brk_name":"Ireland","brk_group":null,"abbrev":"Ire.","postal":"IRL","formal_en":"Ireland","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Ireland","name_alt":null,"mapcolor7":2,"mapcolor8":3,"mapcolor9":2,"mapcolor13":2,"pop_est":4203200,"gdp_md_est":188400,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"IE","iso_a3":"IRL","iso_n3":"372","un_a3":"372","wb_a2":"IE","wb_a3":"IRL","woe_id":-99,"adm0_a3_is":"IRL","adm0_a3_us":"IRL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[78,-63]]}, 21 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Iceland","sov_a3":"ISL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Iceland","adm0_a3":"ISL","geou_dif":0,"geounit":"Iceland","gu_a3":"ISL","su_dif":0,"subunit":"Iceland","su_a3":"ISL","brk_diff":0,"name":"Iceland","name_long":"Iceland","brk_a3":"ISL","brk_name":"Iceland","brk_group":null,"abbrev":"Iceland","postal":"IS","formal_en":"Republic of Iceland","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Iceland","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":4,"mapcolor13":9,"pop_est":306694,"gdp_md_est":12710,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"IS","iso_a3":"ISL","iso_n3":"352","un_a3":"352","wb_a2":"IS","wb_a3":"ISL","woe_id":-99,"adm0_a3_is":"ISL","adm0_a3_us":"ISL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":7,"tiny":-99,"homepart":1},"arcs":[[79]]}, 22 | {"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Italy","sov_a3":"ITA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Italy","adm0_a3":"ITA","geou_dif":0,"geounit":"Italy","gu_a3":"ITA","su_dif":0,"subunit":"Italy","su_a3":"ITA","brk_diff":0,"name":"Italy","name_long":"Italy","brk_a3":"ITA","brk_name":"Italy","brk_group":null,"abbrev":"Italy","postal":"I","formal_en":"Italian Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Italy","name_alt":null,"mapcolor7":6,"mapcolor8":7,"mapcolor9":8,"mapcolor13":7,"pop_est":58126212,"gdp_md_est":1823000,"pop_year":-99,"lastcensus":2012,"gdp_year":-99,"economy":"1. Developed region: G7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"IT","iso_a3":"ITA","iso_n3":"380","un_a3":"380","wb_a2":"IT","wb_a3":"ITA","woe_id":-99,"adm0_a3_is":"ITA","adm0_a3_us":"ITA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[80]],[[81]],[[82,83,-60,-31,-8]]]}, 23 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Kosovo","sov_a3":"KOS","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Kosovo","adm0_a3":"KOS","geou_dif":0,"geounit":"Kosovo","gu_a3":"KOS","su_dif":0,"subunit":"Kosovo","su_a3":"KOS","brk_diff":1,"name":"Kosovo","name_long":"Kosovo","brk_a3":"B57","brk_name":"Kosovo","brk_group":null,"abbrev":"Kos.","postal":"KO","formal_en":"Republic of Kosovo","formal_fr":null,"note_adm0":null,"note_brk":"Self admin.; Claimed by Serbia","name_sort":"Kosovo","name_alt":null,"mapcolor7":2,"mapcolor8":2,"mapcolor9":3,"mapcolor13":11,"pop_est":1804838,"gdp_md_est":5352,"pop_year":-99,"lastcensus":1981,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"-99","iso_a3":"-99","iso_n3":"-99","un_a3":"-099","wb_a2":"KV","wb_a3":"KSV","woe_id":-99,"adm0_a3_is":"SRB","adm0_a3_us":"KOS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-5,84,85,86]]}, 24 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Lithuania","sov_a3":"LTU","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Lithuania","adm0_a3":"LTU","geou_dif":0,"geounit":"Lithuania","gu_a3":"LTU","su_dif":0,"subunit":"Lithuania","su_a3":"LTU","brk_diff":0,"name":"Lithuania","name_long":"Lithuania","brk_a3":"LTU","brk_name":"Lithuania","brk_group":null,"abbrev":"Lith.","postal":"LT","formal_en":"Republic of Lithuania","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Lithuania","name_alt":null,"mapcolor7":6,"mapcolor8":3,"mapcolor9":3,"mapcolor13":9,"pop_est":3555179,"gdp_md_est":63330,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"LT","iso_a3":"LTU","iso_n3":"440","un_a3":"440","wb_a2":"LT","wb_a3":"LTU","woe_id":-99,"adm0_a3_is":"LTU","adm0_a3_us":"LTU","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":9,"long_len":9,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[87,88,89,-26,90]]}, 25 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Luxembourg","sov_a3":"LUX","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Luxembourg","adm0_a3":"LUX","geou_dif":0,"geounit":"Luxembourg","gu_a3":"LUX","su_dif":0,"subunit":"Luxembourg","su_a3":"LUX","brk_diff":0,"name":"Luxembourg","name_long":"Luxembourg","brk_a3":"LUX","brk_name":"Luxembourg","brk_group":null,"abbrev":"Lux.","postal":"L","formal_en":"Grand Duchy of Luxembourg","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Luxembourg","name_alt":null,"mapcolor7":1,"mapcolor8":7,"mapcolor9":3,"mapcolor13":7,"pop_est":491775,"gdp_md_est":39370,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"LU","iso_a3":"LUX","iso_n3":"442","un_a3":"442","wb_a2":"LU","wb_a3":"LUX","woe_id":-99,"adm0_a3_is":"LUX","adm0_a3_us":"LUX","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":10,"long_len":10,"abbrev_len":4,"tiny":5,"homepart":1},"arcs":[[-43,-59,-15]]}, 26 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Latvia","sov_a3":"LVA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Latvia","adm0_a3":"LVA","geou_dif":0,"geounit":"Latvia","gu_a3":"LVA","su_dif":0,"subunit":"Latvia","su_a3":"LVA","brk_diff":0,"name":"Latvia","name_long":"Latvia","brk_a3":"LVA","brk_name":"Latvia","brk_group":null,"abbrev":"Lat.","postal":"LV","formal_en":"Republic of Latvia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Latvia","name_alt":null,"mapcolor7":4,"mapcolor8":7,"mapcolor9":6,"mapcolor13":13,"pop_est":2231503,"gdp_md_est":38860,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"LV","iso_a3":"LVA","iso_n3":"428","un_a3":"428","wb_a2":"LV","wb_a3":"LVA","woe_id":-99,"adm0_a3_is":"LVA","adm0_a3_us":"LVA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[91,-52,92,-27,-90]]}, 27 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Moldova","sov_a3":"MDA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Moldova","adm0_a3":"MDA","geou_dif":0,"geounit":"Moldova","gu_a3":"MDA","su_dif":0,"subunit":"Moldova","su_a3":"MDA","brk_diff":0,"name":"Moldova","name_long":"Moldova","brk_a3":"MDA","brk_name":"Moldova","brk_group":null,"abbrev":"Mda.","postal":"MD","formal_en":"Republic of Moldova","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Moldova","name_alt":null,"mapcolor7":3,"mapcolor8":5,"mapcolor9":4,"mapcolor13":12,"pop_est":4320748,"gdp_md_est":10670,"pop_year":-99,"lastcensus":2004,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MD","iso_a3":"MDA","iso_n3":"498","un_a3":"498","wb_a2":"MD","wb_a3":"MDA","woe_id":-99,"adm0_a3_is":"MDA","adm0_a3_us":"MDA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[93,94]]}, 28 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Macedonia","sov_a3":"MKD","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Macedonia","adm0_a3":"MKD","geou_dif":0,"geounit":"Macedonia","gu_a3":"MKD","su_dif":0,"subunit":"Macedonia","su_a3":"MKD","brk_diff":0,"name":"Macedonia","name_long":"Macedonia","brk_a3":"MKD","brk_name":"Macedonia","brk_group":null,"abbrev":"Mkd.","postal":"MK","formal_en":"Former Yugoslav Republic of Macedonia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Macedonia, FYR","name_alt":null,"mapcolor7":5,"mapcolor8":3,"mapcolor9":7,"mapcolor13":3,"pop_est":2066718,"gdp_md_est":18780,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MK","iso_a3":"MKD","iso_n3":"807","un_a3":"807","wb_a2":"MK","wb_a3":"MKD","woe_id":-99,"adm0_a3_is":"MKD","adm0_a3_us":"MKD","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":9,"long_len":9,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-87,95,-21,-67,-1]]}, 29 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Montenegro","sov_a3":"MNE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Montenegro","adm0_a3":"MNE","geou_dif":0,"geounit":"Montenegro","gu_a3":"MNE","su_dif":0,"subunit":"Montenegro","su_a3":"MNE","brk_diff":0,"name":"Montenegro","name_long":"Montenegro","brk_a3":"MNE","brk_name":"Montenegro","brk_group":null,"abbrev":"Mont.","postal":"ME","formal_en":"Montenegro","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Montenegro","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":4,"mapcolor13":5,"pop_est":672180,"gdp_md_est":6816,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"ME","iso_a3":"MNE","iso_n3":"499","un_a3":"499","wb_a2":"ME","wb_a3":"MNE","woe_id":-99,"adm0_a3_is":"MNE","adm0_a3_us":"MNE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":10,"long_len":10,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[96,-70,-24,97,-85,-4]]}, 30 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Netherlands","sov_a3":"NL1","adm0_dif":1,"level":2,"type":"Country","admin":"Netherlands","adm0_a3":"NLD","geou_dif":0,"geounit":"Netherlands","gu_a3":"NLD","su_dif":0,"subunit":"Netherlands","su_a3":"NLD","brk_diff":0,"name":"Netherlands","name_long":"Netherlands","brk_a3":"NLD","brk_name":"Netherlands","brk_group":null,"abbrev":"Neth.","postal":"NL","formal_en":"Kingdom of the Netherlands","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Netherlands","name_alt":null,"mapcolor7":4,"mapcolor8":2,"mapcolor9":2,"mapcolor13":9,"pop_est":16715999,"gdp_md_est":672000,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"NL","iso_a3":"NLD","iso_n3":"528","un_a3":"528","wb_a2":"NL","wb_a3":"NLD","woe_id":-99,"adm0_a3_is":"NLD","adm0_a3_us":"NLD","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":11,"long_len":11,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[-44,-13,98]]}, 31 | {"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Norway","sov_a3":"NOR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Norway","adm0_a3":"NOR","geou_dif":0,"geounit":"Norway","gu_a3":"NOR","su_dif":0,"subunit":"Norway","su_a3":"NOR","brk_diff":0,"name":"Norway","name_long":"Norway","brk_a3":"NOR","brk_name":"Norway","brk_group":null,"abbrev":"Nor.","postal":"N","formal_en":"Kingdom of Norway","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Norway","name_alt":null,"mapcolor7":5,"mapcolor8":3,"mapcolor9":8,"mapcolor13":12,"pop_est":4676305,"gdp_md_est":276400,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"NO","iso_a3":"NOR","iso_n3":"578","un_a3":"578","wb_a2":"NO","wb_a3":"NOR","woe_id":-99,"adm0_a3_is":"NOR","adm0_a3_us":"NOR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[99,-56,100,101]],[[102]],[[103]],[[104]]]}, 32 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Poland","sov_a3":"POL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Poland","adm0_a3":"POL","geou_dif":0,"geounit":"Poland","gu_a3":"POL","su_dif":0,"subunit":"Poland","su_a3":"POL","brk_diff":0,"name":"Poland","name_long":"Poland","brk_a3":"POL","brk_name":"Poland","brk_group":null,"abbrev":"Pol.","postal":"PL","formal_en":"Republic of Poland","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Poland","name_alt":null,"mapcolor7":3,"mapcolor8":7,"mapcolor9":1,"mapcolor13":2,"pop_est":38482919,"gdp_md_est":667900,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"PL","iso_a3":"POL","iso_n3":"616","un_a3":"616","wb_a2":"PL","wb_a3":"POL","woe_id":-99,"adm0_a3_is":"POL","adm0_a3_us":"POL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-41,105,106,-91,-30,107,108,-35]]}, 33 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Portugal","sov_a3":"PRT","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Portugal","adm0_a3":"PRT","geou_dif":0,"geounit":"Portugal","gu_a3":"PRT","su_dif":1,"subunit":"Portugal","su_a3":"PR1","brk_diff":0,"name":"Portugal","name_long":"Portugal","brk_a3":"PR1","brk_name":"Portugal","brk_group":null,"abbrev":"Port.","postal":"P","formal_en":"Portuguese Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Portugal","name_alt":null,"mapcolor7":1,"mapcolor8":7,"mapcolor9":1,"mapcolor13":4,"pop_est":10707924,"gdp_md_est":208627,"pop_year":-99,"lastcensus":2011,"gdp_year":0,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"PT","iso_a3":"PRT","iso_n3":"620","un_a3":"620","wb_a2":"PT","wb_a3":"PRT","woe_id":-99,"adm0_a3_is":"PRT","adm0_a3_us":"PRT","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":8,"long_len":8,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[-49,109]]}, 34 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Romania","sov_a3":"ROU","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Romania","adm0_a3":"ROU","geou_dif":0,"geounit":"Romania","gu_a3":"ROU","su_dif":0,"subunit":"Romania","su_a3":"ROU","brk_diff":0,"name":"Romania","name_long":"Romania","brk_a3":"ROU","brk_name":"Romania","brk_group":null,"abbrev":"Rom.","postal":"RO","formal_en":"Romania","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Romania","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":3,"mapcolor13":13,"pop_est":22215421,"gdp_md_est":271400,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"RO","iso_a3":"ROU","iso_n3":"642","un_a3":"642","wb_a2":"RO","wb_a3":"ROM","woe_id":-99,"adm0_a3_is":"ROU","adm0_a3_us":"ROU","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[110,-95,111,112,-18,113,-76]]}, 35 | {"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Russia","sov_a3":"RUS","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Russia","adm0_a3":"RUS","geou_dif":0,"geounit":"Russia","gu_a3":"RUS","su_dif":0,"subunit":"Russia","su_a3":"RUS","brk_diff":0,"name":"Russia","name_long":"Russian Federation","brk_a3":"RUS","brk_name":"Russia","brk_group":null,"abbrev":"Rus.","postal":"RUS","formal_en":"Russian Federation","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Russian Federation","name_alt":null,"mapcolor7":2,"mapcolor8":5,"mapcolor9":7,"mapcolor13":7,"pop_est":140041247,"gdp_md_est":2266000,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"3. Emerging region: BRIC","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"RU","iso_a3":"RUS","iso_n3":"643","un_a3":"643","wb_a2":"RU","wb_a3":"RUS","woe_id":-99,"adm0_a3_is":"RUS","adm0_a3_us":"RUS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":18,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[114]],[[-107,115,-88]],[],[],[[116]],[[117]],[[118]],[[119]],[[120]],[[121,-28,-93,-51,122,-53,-100,123]],[[124]],[[125]],[[126]]]}, 36 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Republic of Serbia","sov_a3":"SRB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Republic of Serbia","adm0_a3":"SRB","geou_dif":0,"geounit":"Republic of Serbia","gu_a3":"SRB","su_dif":0,"subunit":"Republic of Serbia","su_a3":"SRB","brk_diff":0,"name":"Serbia","name_long":"Serbia","brk_a3":"SRB","brk_name":"Serbia","brk_group":null,"abbrev":"Serb.","postal":"RS","formal_en":"Republic of Serbia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Serbia","name_alt":null,"mapcolor7":3,"mapcolor8":3,"mapcolor9":2,"mapcolor13":10,"pop_est":7379339,"gdp_md_est":80340,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"RS","iso_a3":"SRB","iso_n3":"688","un_a3":"688","wb_a2":"YF","wb_a3":"SRB","woe_id":-99,"adm0_a3_is":"SRB","adm0_a3_us":"SRB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[-22,-96,-86,-98,-23,-69,-77,-114]]}, 37 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Slovakia","sov_a3":"SVK","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Slovakia","adm0_a3":"SVK","geou_dif":0,"geounit":"Slovakia","gu_a3":"SVK","su_dif":0,"subunit":"Slovakia","su_a3":"SVK","brk_diff":0,"name":"Slovakia","name_long":"Slovakia","brk_a3":"SVK","brk_name":"Slovakia","brk_group":null,"abbrev":"Svk.","postal":"SK","formal_en":"Slovak Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Slovak Republic","name_alt":null,"mapcolor7":2,"mapcolor8":4,"mapcolor9":4,"mapcolor13":9,"pop_est":5463046,"gdp_md_est":119500,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"SK","iso_a3":"SVK","iso_n3":"703","un_a3":"703","wb_a2":"SK","wb_a3":"SVK","woe_id":-99,"adm0_a3_is":"SVK","adm0_a3_us":"SVK","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-109,127,-74,-12,-36]]}, 38 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Sweden","sov_a3":"SWE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Sweden","adm0_a3":"SWE","geou_dif":0,"geounit":"Sweden","gu_a3":"SWE","su_dif":0,"subunit":"Sweden","su_a3":"SWE","brk_diff":0,"name":"Sweden","name_long":"Sweden","brk_a3":"SWE","brk_name":"Sweden","brk_group":null,"abbrev":"Swe.","postal":"S","formal_en":"Kingdom of Sweden","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Sweden","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":2,"mapcolor13":4,"pop_est":9059651,"gdp_md_est":344300,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"SE","iso_a3":"SWE","iso_n3":"752","un_a3":"752","wb_a2":"SE","wb_a3":"SWE","woe_id":-99,"adm0_a3_is":"SWE","adm0_a3_us":"SWE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-101,-55,128]]}, 39 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Slovenia","sov_a3":"SVN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Slovenia","adm0_a3":"SVN","geou_dif":0,"geounit":"Slovenia","gu_a3":"SVN","su_dif":0,"subunit":"Slovenia","su_a3":"SVN","brk_diff":0,"name":"Slovenia","name_long":"Slovenia","brk_a3":"SVN","brk_name":"Slovenia","brk_group":null,"abbrev":"Slo.","postal":"SLO","formal_en":"Republic of Slovenia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Slovenia","name_alt":null,"mapcolor7":2,"mapcolor8":3,"mapcolor9":2,"mapcolor13":12,"pop_est":2005692,"gdp_md_est":59340,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"SI","iso_a3":"SVN","iso_n3":"705","un_a3":"705","wb_a2":"SI","wb_a3":"SVN","woe_id":-99,"adm0_a3_is":"SVN","adm0_a3_us":"SVN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-7,-78,-72,129,-83]]}, 40 | {"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Ukraine","sov_a3":"UKR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Ukraine","adm0_a3":"UKR","geou_dif":0,"geounit":"Ukraine","gu_a3":"UKR","su_dif":0,"subunit":"Ukraine","su_a3":"UKR","brk_diff":0,"name":"Ukraine","name_long":"Ukraine","brk_a3":"UKR","brk_name":"Ukraine","brk_group":null,"abbrev":"Ukr.","postal":"UA","formal_en":"Ukraine","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Ukraine","name_alt":null,"mapcolor7":5,"mapcolor8":1,"mapcolor9":6,"mapcolor13":3,"pop_est":45700395,"gdp_md_est":339800,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"UA","iso_a3":"UKR","iso_n3":"804","un_a3":"804","wb_a2":"UA","wb_a3":"UKR","woe_id":-99,"adm0_a3_is":"UKR","adm0_a3_us":"UKR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-122,130,-112,-94,-111,-75,-128,-108,-29]]}]}} 41 | ,"arcs":[[[5571,5025],[-3,-43],[4,-54],[11,-31]],[[5583,4897],[0,-33],[-9,-18],[-2,-41],[-13,-61]],[[5559,4744],[-5,8],[0,28],[-15,43],[-3,60],[2,86],[4,39],[-4,20]],[[5538,5028],[-2,40],[12,62],[1,-23],[8,11]],[[5557,5118],[6,-34],[7,-13],[1,-46]],[[5471,5817],[-2,-52],[-16,0],[6,-28],[-9,-81]],[[5450,5656],[-6,-21],[-24,-3],[-14,-29],[-23,10]],[[5383,5613],[-40,32],[-6,44],[-27,-22],[-4,-24],[-16,18]],[[5290,5661],[-15,4],[-12,23],[4,31],[-1,22]],[[5266,5741],[8,7],[14,-35],[4,33],[25,-5],[20,22],[13,-3],[9,-26],[2,21],[-4,82],[10,17],[10,58]],[[5377,5912],[21,-41],[15,52],[10,9],[22,-38],[13,6],[13,-24]],[[5471,5876],[-3,-16],[3,-43]],[[5092,6223],[20,-10],[26,27],[17,-56],[16,-29]],[[5171,6155],[-4,-85]],[[5167,6070],[-7,-5],[-3,-71]],[[5157,5994],[-24,58],[-14,-10],[-20,59],[-13,51],[-13,2],[-4,44]],[[5069,6198],[23,25]],[[5629,5326],[8,-52],[11,9],[21,-20],[41,-6],[13,32],[33,29],[20,-46],[17,-13]],[[5793,5259],[-15,-52],[-10,-91],[9,-72],[-24,17],[-28,-39]],[[5725,5022],[0,-63],[-26,-12],[-19,44],[-22,-35],[-21,4]],[[5637,4960],[-2,83],[-14,41]],[[5621,5084],[5,18],[-3,15],[4,40],[11,39],[-14,55],[-2,46],[7,29]],[[5527,5405],[10,0],[-7,-56],[14,-48],[-4,-60],[-7,-5]],[[5533,5236],[-5,-12],[-9,-29],[-4,-69]],[[5515,5126],[-25,47],[-10,53],[-11,28],[-12,47],[-6,39],[-14,59],[6,53],[10,-29],[6,26],[13,3],[24,-21],[19,2],[12,-28]],[[5652,6547],[27,0],[30,47],[6,71],[23,41],[-3,56]],[[5735,6762],[17,22],[30,48]],[[5782,6832],[29,-31],[4,-32],[15,15],[27,-30],[3,-59],[-6,-34],[17,-83],[12,-23],[-2,-22],[19,-23],[8,-33],[-11,-28],[-23,4],[-5,-11],[7,-42],[6,-81]],[[5882,6319],[-23,-8],[-9,-27],[-2,-64],[-11,12],[-25,-6],[-7,30],[-11,-22],[-10,18],[-22,3],[-31,30],[-28,10],[-22,-3],[-15,-34],[-13,-5]],[[5653,6253],[-1,56],[-8,58],[17,26],[0,51],[-8,48],[-1,55]],[[5290,5661],[-3,-51],[-12,-22],[-20,16],[-6,-51],[-14,-4],[-5,20],[-15,-43],[-13,-6],[-12,27]],[[5190,5547],[-10,56],[-13,-20],[0,57],[21,71],[-1,32],[12,-11],[8,21]],[[5207,5753],[24,-1],[5,28],[30,-39]],[[5377,5912],[-16,54],[-14,30],[-3,54],[-5,37],[21,28],[10,31],[20,25],[7,24],[7,-15],[13,13]],[[5417,6193],[13,-40],[21,-11],[-2,-35],[15,-26],[4,32],[19,-14],[3,-39],[20,-8],[13,-62]],[[5523,5990],[-8,0],[-4,-23],[-7,-5],[-2,-29],[-5,-6],[-1,-12],[-9,-13],[-12,2],[-4,-28]],[[5352,6762],[-17,-102],[-29,71],[-4,52],[41,42],[9,-63]],[[5275,6683],[-18,-20],[-21,17]],[[5236,6680],[-11,70],[-1,129],[5,34],[8,38],[24,8],[10,35],[22,35],[-1,-64],[-8,-42],[4,-35],[15,-19],[-7,-48],[-8,14],[-20,-91],[7,-61]],[[5275,6683],[1,-49],[28,-30],[-1,-44],[29,23],[15,35],[32,-50],[13,-40]],[[5392,6528],[6,-64],[-8,-34],[11,-45],[6,-68],[-2,-43],[12,-81]],[[5207,5753],[3,90],[14,86],[-40,24],[-13,33]],[[5171,5986],[2,55],[-6,29]],[[5171,6155],[-5,132],[17,0],[7,48],[6,115],[-5,43]],[[5191,6493],[6,27],[23,7],[5,-28],[19,62],[-6,47],[-2,72]],[[4749,5028],[1,90],[-11,55],[39,91],[34,-23],[37,1],[30,-21],[23,6],[45,-4]],[[4947,5223],[11,-49],[51,-57],[10,27],[31,-57],[32,16]],[[5082,5103],[2,-73],[-26,-84],[-36,-27],[-2,-42],[-18,-70],[-10,-103],[11,-72],[-16,-57],[-6,-82],[-21,-25],[-20,-97],[-35,-2],[-27,3],[-17,-45],[-11,-48],[-13,11],[-11,42],[-8,73],[-26,20]],[[4792,4425],[-2,41],[10,48],[4,34],[-9,38],[7,82],[-11,76],[12,11],[1,59],[5,19],[0,98],[13,34],[-8,64],[-16,4],[-5,-16],[-16,0],[-7,62],[-11,-19],[-10,-32]],[[5675,7037],[3,75],[-10,-16],[-18,45],[-2,72],[35,36],[35,18],[30,-21],[29,4]],[[5777,7250],[4,-22],[-20,-73],[8,-118],[-12,-40]],[[5757,6997],[-22,0],[-24,47],[-13,16],[-23,-23]],[[5794,8461],[-4,-89],[42,-84],[-26,-95],[33,-144],[-19,-108],[25,-94],[-11,-82],[41,-87],[-11,-64],[-25,-73],[-60,-161]],[[5779,7380],[-50,-10],[-49,-47],[-45,-26],[-16,69],[-27,41],[6,124],[-14,114],[14,74],[25,79],[63,137],[19,26],[-3,54],[-39,59]],[[5663,8074],[-9,50],[-1,194],[-43,86],[-37,62]],[[5573,8466],[17,33],[30,-67],[37,7],[30,-31],[26,56],[14,93],[43,42],[35,-50],[-11,-88]],[[3540,57],[-11,-48],[-13,-9],[-4,36],[-6,5],[-9,-34],[-12,26],[7,54],[3,57],[4,54],[-10,75],[-3,86],[15,109],[9,-14],[21,-30],[29,-107],[5,-52],[-17,-115],[-8,-93]],[[5265,5063],[-9,-98],[-13,26],[-6,85],[5,47],[18,48],[5,-108]],[[5157,5994],[6,-11],[8,3]],[[5190,5547],[-2,-35],[9,-48],[-10,-38],[7,-98],[15,-16],[-3,-55]],[[5206,5257],[-25,-71],[-55,34],[-40,-41],[-4,-76]],[[4947,5223],[14,76],[5,251],[-28,133],[-21,64],[-42,48],[-3,92],[36,28],[47,-33],[-9,143],[26,-54],[65,99],[8,103],[24,25]],[[4827,6542],[-21,26],[-17,-2],[6,68],[-6,67]],[[4789,6701],[23,6],[30,-78],[-15,-87]],[[4916,7144],[-30,-137],[29,17],[30,0],[-7,-103],[-25,-113],[29,-8],[2,-14],[25,-149],[19,-20],[17,-144],[8,-50],[33,-24],[-3,-80],[-14,-37],[11,-66],[-25,-66],[-37,1],[-48,-34],[-13,24],[-18,-59],[-26,15],[-19,-49],[-15,26],[41,132],[25,28],[-1,0],[-43,21],[-8,50],[29,39],[-15,68],[5,83],[42,-12],[4,74],[-19,77],[0,2],[-34,22],[-7,35],[10,56],[-9,35],[-15,-60],[-1,122],[-14,64],[10,131],[21,102],[23,-10],[33,11]],[[5658,4249],[15,-43],[22,7],[20,-9],[0,-22],[15,16],[-4,-38],[-40,-10],[1,20],[-34,25],[5,54]],[[5583,4897],[18,12],[11,27],[15,-2],[5,22],[5,4]],[[5725,5022],[13,-34],[-8,-79],[-7,-14],[-17,4],[-14,12],[-34,-33],[19,-71],[-14,-21],[-15,0],[-15,65],[-5,-28],[6,-75],[14,-59],[-10,-28],[15,-58],[14,-37],[0,-71],[-25,33],[8,-64],[-18,-13],[11,-112],[-19,-1],[-23,55],[-10,101],[-5,84],[-11,58],[-14,72],[-2,36]],[[5522,5537],[7,-49],[9,-36],[-11,-47]],[[5515,5126],[-3,-22]],[[5512,5104],[-26,47],[-16,45],[-26,38],[-23,93],[6,9],[-13,53],[-1,43],[-17,20],[-9,-55],[-8,43],[0,43],[1,2]],[[5380,5485],[20,-4],[5,21],[9,-20],[11,-3],[0,36],[10,13],[2,51],[23,33]],[[5460,5612],[8,-15],[21,-55],[23,-24],[10,19]],[[5471,5817],[14,-33],[10,-14],[24,16],[2,25],[11,4],[14,20],[3,-8],[13,15],[6,30],[9,8],[30,-39],[6,13]],[[5613,5854],[15,-34],[2,-34]],[[5630,5786],[-17,-26],[-13,-86],[-17,-86],[-22,-23]],[[5561,5565],[-17,5],[-22,-33]],[[5460,5612],[-6,43],[-4,1]],[[4827,6542],[5,-90],[-21,-113],[-49,-75],[-40,19],[23,132],[-15,129],[38,98],[21,59]],[[4597,8131],[-7,-82],[31,-86],[-36,-96],[-80,-87],[-24,-23],[-36,19],[-78,40],[28,56],[-61,62],[49,24],[-1,37],[-58,29],[19,83],[42,18],[43,-85],[42,68],[35,-35],[45,67],[47,-9]],[[5431,4568],[-10,-100],[4,-39],[-6,-65],[-21,48],[-14,13],[-39,65],[4,64],[32,-11],[28,14],[22,11]],[[5255,4944],[17,-90],[-4,-167],[-13,8],[-11,-42],[-10,33],[-2,153],[-6,72],[15,-6],[14,39]],[[5383,5613],[-3,-62],[7,-54]],[[5387,5497],[-22,18],[-23,-45],[1,-62],[-3,-36],[9,-65],[26,-63],[14,-104],[31,-102],[22,1],[7,-28],[-8,-25],[25,-46],[20,-38],[24,-66],[3,-24],[-5,-45],[-16,59],[-24,21],[-12,-82],[20,-47],[-3,-66],[-11,-7],[-15,-108],[-12,-10],[0,39],[6,67],[6,27],[-11,73],[-8,64],[-12,16],[-8,54],[-18,23],[-12,51],[-21,8],[-21,57],[-26,82],[-19,73],[-8,125],[-14,15],[-23,41],[-12,-17],[-16,-58],[-12,-10]],[[5557,5118],[5,28]],[[5562,5146],[7,9],[4,42],[5,7],[4,-18],[5,-8],[3,-20],[5,-6],[5,-23],[4,1],[-3,-31],[-3,-15],[1,-10]],[[5599,5074],[-6,-4],[-17,-20],[-1,-26],[-4,1]],[[5631,6600],[-2,32],[3,35],[-13,20],[-29,22]],[[5590,6709],[-6,106]],[[5584,6815],[32,39],[47,-8],[27,12],[4,-26],[15,-8],[26,-62]],[[5652,6547],[-7,39],[-14,14]],[[5584,6815],[1,95],[14,79],[26,43],[22,-94],[22,3],[6,96]],[[5757,6997],[14,-29],[2,-61],[9,-75]],[[5739,5829],[6,18],[19,13],[20,-39],[12,-5],[12,-34],[-2,-43],[11,-21],[4,-52],[9,-32],[-2,-19],[5,-13],[-7,-9],[-16,3],[-3,18],[-6,-10],[2,-23],[-7,-40],[-5,-43],[-7,-14]],[[5784,5484],[-5,57],[3,54],[-1,56],[-16,75],[-9,53],[-9,38],[-8,12]],[[5599,5074],[9,8],[13,2]],[[5538,5028],[-6,10],[-8,41],[-12,25]],[[5533,5236],[8,-22],[4,-17],[9,-14],[10,-26],[-2,-11]],[[5092,6223],[14,35],[24,186],[38,53],[23,-4]],[[5863,8523],[-47,-51],[-22,-11]],[[5573,8466],[-17,-5],[-4,-84],[-53,21],[-7,-71],[-27,1],[-18,-90],[-28,-140],[-43,-178],[10,-43],[-10,-50],[-27,2],[-18,-118],[2,-168],[17,-64],[-9,-148],[-23,-87],[-12,-72]],[[5306,7172],[-19,77],[-55,-146],[-37,-30],[-38,65],[-10,136],[-9,291],[26,81],[73,106],[55,130],[51,176],[66,244],[47,95],[76,159],[61,55],[46,-7],[42,105],[51,-6],[50,25],[87,-92],[-36,-34],[30,-79]],[[5686,9570],[-62,-51],[-49,29],[19,32],[-16,41],[57,25],[11,-47],[40,-29]],[[5506,9803],[92,-94],[-70,-49],[-15,-93],[-25,-24],[-13,-105],[-34,-5],[-59,77],[25,45],[-42,37],[-54,106],[-21,99],[75,45],[16,-44],[39,2],[11,43],[40,5],[35,-45]],[[5706,9893],[55,-45],[-41,-68],[-81,-15],[-82,21],[-5,35],[-40,2],[-30,58],[86,36],[40,-31],[28,38],[70,-31]],[[5392,6528],[19,37],[43,58],[35,43],[28,-21],[2,-31],[27,-2]],[[5546,6612],[34,-14],[51,2]],[[5653,6253],[14,-110],[-3,-36],[-14,-15],[-25,-105],[7,-56],[-6,7]],[[5626,5938],[-26,49],[-20,-18],[-13,13],[-17,-27],[-14,44],[-11,-17],[-2,8]],[[4792,4425],[-11,-33],[-14,18],[-15,-14],[5,98],[-3,78],[-12,12],[-7,48],[2,82],[11,46],[2,51],[6,76],[-1,53],[-5,46],[-1,42]],[[5630,5786],[12,27],[17,-14],[18,0],[13,-31],[10,19],[20,12],[7,30],[12,0]],[[5784,5484],[12,-23],[13,20],[13,-22]],[[5822,5459],[0,-32],[-13,-27],[-9,11],[-7,-152]],[[5629,5326],[-5,22],[6,21],[-7,16],[-8,-29],[-17,37],[-2,52],[-17,30],[-3,40],[-15,50]],[[8989,6148],[28,-224],[-41,42],[-17,-182],[27,-130],[-1,-88],[-21,76],[-18,-98],[-5,106],[3,123],[-3,136],[6,96],[2,169],[-17,124],[3,172],[25,58],[-11,59],[13,18],[7,-84],[10,-121],[-1,-125],[11,-127]],[[5546,6612],[6,56],[38,41]],[[9999,8684],[-30,-7],[-5,40],[-9964,53],[4,5],[23,0],[40,-36],[-2,-17],[-29,-31],[-36,-7],[9999,0]],[[8988,8984],[-42,-1],[-57,14],[-5,7],[27,50],[34,12],[40,-49],[3,-33]],[[9186,9220],[-32,-49],[-44,11],[-52,50],[7,41],[51,-19],[70,-34]],[[9029,9281],[-22,-94],[-102,4],[-46,-30],[-55,82],[15,87],[37,23],[73,-5],[100,-67]],[[6598,8670],[-17,-12],[-91,17],[-7,56],[-50,34],[-4,68],[28,27],[-1,69],[55,108],[-25,15],[66,111],[-7,57],[62,67],[91,81],[93,24],[48,46],[54,17],[19,-50],[-19,-39],[-98,-63],[-85,-60],[-86,-120],[-42,-124],[-43,-121],[5,-105],[54,-103]],[[6061,5688],[1,56],[14,35],[27,9],[5,42],[-7,70],[12,66],[-1,37],[-41,41],[-16,-1],[-17,59],[-21,-20],[-35,44],[0,25],[-10,55],[-22,6],[-2,39],[7,26],[-18,71],[-29,-12],[-8,6],[-7,-28],[-11,5]],[[5777,7250],[31,70],[-29,60]],[[5863,8523],[29,44],[46,-77],[76,-30],[105,-142],[21,-60],[2,-84],[-31,-67],[-45,-33],[-124,95],[-21,-16],[45,-92],[2,-59],[2,-129],[36,-38],[22,-33],[3,61],[-17,55],[18,47],[67,-78],[24,31],[-19,92],[65,124],[25,-8],[26,-44],[16,87],[-23,75],[14,76],[-21,78],[78,-40],[16,-71],[-35,-16],[0,-70],[22,-43],[43,27],[7,81],[58,60],[97,108],[20,-6],[-27,-77],[35,-13],[19,43],[52,4],[42,52],[31,-76],[32,84],[-29,73],[14,42],[82,-39],[39,-39],[100,-144],[19,66],[-28,67],[-1,26],[-34,13],[10,60],[-15,98],[-1,40],[51,115],[18,115],[21,24],[74,-33],[5,-70],[-26,-103],[17,-40],[9,-88],[-6,-173],[31,-77],[-12,-85],[-55,-179],[32,-19],[11,46],[31,32],[7,63],[24,60],[-16,72],[13,83],[-31,10],[-6,71],[22,126],[-36,103],[50,85],[-7,90],[14,3],[15,-70],[-11,-122],[29,-23],[-12,91],[46,50],[58,7],[51,-72],[-25,105],[-2,134],[48,26],[67,-6],[60,17],[-23,66],[33,83],[31,3],[54,63],[74,16],[9,35],[73,12],[23,-29],[62,68],[51,-3],[8,55],[26,54],[66,51],[48,-40],[-38,-32],[63,-19],[7,-62],[25,30],[82,-1],[62,-62],[23,-47],[-7,-66],[-31,-37],[-73,-70],[-21,-38],[35,-17],[41,-32],[25,24],[14,-81],[12,32],[44,20],[90,-20],[6,-60],[116,-18],[2,96],[59,-22],[44,1],[45,-67],[13,-81],[-17,-52],[35,-100],[44,-51],[27,132],[44,-56],[48,34],[53,-39],[21,35],[45,-18],[-20,118],[37,54],[251,-82],[24,-75],[72,-96],[112,24],[56,-21],[23,-52],[-4,-93],[35,-35],[37,25],[49,4],[52,-25],[53,14],[49,-112],[34,40],[-23,81],[13,56],[88,-35],[58,7],[80,-60],[-9960,-55],[68,-97],[73,-125],[-3,-79],[19,-31],[-6,92],[75,-19],[55,-118],[-28,-55],[-46,-13],[0,-124],[-11,-26],[-26,4],[-22,44],[-36,37],[-7,54],[-28,21],[-31,-16],[-16,44],[6,47],[-33,-30],[13,-60],[-16,-53],[0,-1],[9963,-55],[-36,9],[25,-67],[17,-104],[13,-34],[3,-53],[-7,-33],[-52,27],[-78,-95],[-25,-14],[-42,-89],[-40,-78],[-11,-57],[-39,87],[-73,-99],[-12,47],[-27,-54],[-37,17],[-9,-83],[-33,-122],[1,-51],[31,-28],[-4,-184],[-25,-5],[-12,-105],[11,-55],[-48,-64],[-10,-144],[-41,-31],[-9,-128],[-40,-118],[-10,87],[-12,184],[-15,281],[13,175],[23,75],[2,59],[43,29],[50,159],[47,129],[50,101],[23,178],[-34,-11],[-17,-104],[-70,-138],[-23,155],[-72,-43],[-69,-211],[23,-78],[-62,-33],[-43,-13],[2,91],[-43,20],[-35,-62],[-85,21],[-91,-37],[-90,-247],[-106,-297],[43,-16],[14,-79],[27,-28],[18,63],[30,-9],[40,-138],[1,-108],[-21,-126],[-3,-151],[-12,-202],[-42,-182],[-9,-88],[-38,-147],[-38,-145],[-18,-75],[-37,-74],[-17,-2],[-17,62],[-38,-93],[-4,-42],[-4,22],[0,64],[14,4],[4,149],[-7,108],[24,45],[33,-23],[19,123],[9,139],[11,46],[15,113],[-46,-37],[-24,-50],[-42,0],[-12,119],[-32,90],[-49,40],[-10,124],[-10,77],[-10,55],[-17,127],[-25,47],[-41,37],[-37,-3],[-35,-23],[-23,-63],[16,-30],[0,-70],[-15,-40],[-26,-134],[1,-55],[-39,-80],[-34,47],[-33,-10],[-14,42],[-17,14],[-41,-89],[-36,-21],[-26,-31],[-35,20],[-26,-1],[-16,64],[-28,61],[-27,17],[-36,-17],[-26,-23],[-39,53],[-6,95],[-32,32],[-26,15],[-31,52],[-28,-131],[11,-74],[-27,-88],[-40,32],[-28,4],[-19,59],[-29,2],[-24,39],[-42,-60],[-53,-108],[-29,-22],[-11,-11],[-15,78],[-36,-17],[-11,53],[-20,25],[-13,73],[-16,22],[-39,-32],[-39,73],[-15,-66],[-62,320],[-35,98],[10,39],[-69,-119],[-27,-7],[2,69],[-35,43],[-29,-31],[-9,131],[-50,27],[-25,-52],[-70,-47],[-13,-31],[-104,-44],[-13,-43],[20,-86],[-26,-33],[5,-34],[-27,-62],[45,-87],[-7,-60],[-39,6],[-8,-38],[-35,66],[-44,-3],[-30,-53],[-33,51],[-61,87],[-43,-3],[-58,-137],[-3,-92],[-29,73],[-22,-139],[8,-26],[-16,-95],[24,-86],[20,4],[18,-85],[-3,-65],[14,-20],[-12,-75],[-27,-21],[-28,-130],[25,-120],[-2,-85],[30,-149],[-17,-51],[-4,-32],[-13,9],[-19,77],[-8,4],[-17,29],[-9,52],[-25,26],[-17,-19],[-5,23],[-38,61],[-41,20],[-23,22],[-4,-15],[-35,106],[-32,48],[-24,74],[20,20],[23,106],[-15,50],[41,51],[-1,28],[-25,-20]],[[7918,9627],[-157,-48],[51,165],[23,15],[21,-9],[70,-71],[-8,-52]],[[6420,9910],[-37,-16],[-25,-10],[-4,-21],[-33,-21],[-30,30],[16,40],[-62,4],[54,23],[43,1],[5,-34],[16,30],[26,21],[42,-28],[-11,-19]],[[7775,9700],[-60,-16],[-78,37],[-46,48],[-21,90],[-38,25],[72,86],[60,29],[54,-64],[64,-122],[-7,-113]],[[5626,5938],[-8,-33],[-5,-51]],[[5663,8074],[-47,-35],[-27,-88],[4,-78],[-44,-101],[-54,-109],[-20,-178],[20,-89],[26,-70],[-25,-142],[-29,-30],[-11,-212],[-15,-118],[-34,12],[-16,-100],[-32,-6],[-9,120],[-23,143],[-21,179]],[[5380,5485],[7,12]],[[6061,5688],[-22,-10],[-18,-41],[-26,-7],[-24,-47],[1,-79],[14,-30],[28,8],[-5,-45],[-31,-22],[-37,-73],[-16,25],[6,60],[-30,37],[5,24],[26,42],[-8,29],[-43,32],[-2,47],[-25,-16],[-11,-69],[-21,-94]]] 42 | ,"transform":{"scale":[0.036003600360036005,0.007920493130611456],"translate":[-180,2.053389187016037]},"bbox":[-180,2.053389187016037,180,81.2504]} -------------------------------------------------------------------------------- /docs/main.css: -------------------------------------------------------------------------------- 1 | 2 | /* general styles */ 3 | 4 | html, body, input, select, button, textarea, table { 5 | font-size: 100%; 6 | font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; 7 | -webkit-font-smoothing: antialiased; 8 | -moz-osx-font-smoothing: grayscale; 9 | text-rendering: optimizeLegibility; 10 | } 11 | 12 | body { 13 | line-height: 1.5; 14 | color: #333; 15 | } 16 | 17 | p { 18 | margin: 24px 0; 19 | } 20 | 21 | a, a span.hljs-string { 22 | color: #1EB300; 23 | } 24 | 25 | a:hover, a:focus { 26 | color: #160; 27 | } 28 | 29 | hr { 30 | background: #ddd; 31 | color: #ddd; 32 | height: 1px; 33 | margin: 0 0 1.4em; 34 | border: none; 35 | clear: both; 36 | } 37 | 38 | .clearfix:before, 39 | .clearfix:after { 40 | content: " "; 41 | display: table; 42 | } 43 | 44 | .clearfix:after { 45 | clear: both; 46 | } 47 | 48 | table { 49 | width: 100%; 50 | border-collapse: collapse; 51 | margin-bottom: 2em; 52 | } 53 | 54 | th, td { 55 | text-align: left; 56 | border: 0; 57 | border: 1px solid #eee; 58 | padding: 0.5em 1em 0.5em 1em; 59 | } 60 | 61 | table th { 62 | background: #eee; 63 | } 64 | 65 | table td { 66 | color: #666; 67 | } 68 | 69 | table td:first-child { 70 | color: #777; 71 | } 72 | 73 | table td:last-child { 74 | color: black; 75 | } 76 | 77 | table td code i { 78 | color: #00A707; 79 | } 80 | 81 | table td code b { 82 | color: black; 83 | font-weight: normal; 84 | } 85 | 86 | iframe { 87 | border: none; 88 | } 89 | 90 | 91 | /* headings */ 92 | 93 | h2 { 94 | font-weight: 400; 95 | font-size: 2em; 96 | font-weight: 300; 97 | color: black; 98 | margin-top: 1.6em; 99 | padding-top: .2em; 100 | } 101 | 102 | h2:first-child { 103 | margin-top: 1em; 104 | } 105 | 106 | h2:target { 107 | color: #1EB300; 108 | } 109 | 110 | h3 { 111 | margin-top: 1.5em; 112 | padding-top: .5em; 113 | color: black; 114 | font-weight: 500; 115 | font-size: 1.4em; 116 | } 117 | 118 | .blog-page h3 { 119 | padding-top: 0; 120 | } 121 | 122 | h4 { 123 | font-size: 1.1em; 124 | font-weight: 500; 125 | margin: 1em 0 1em; 126 | } 127 | 128 | 129 | /* general layout */ 130 | 131 | .container { 132 | max-width: 54em; 133 | padding: 0 6em 1.5em; 134 | margin: 0 auto; 135 | } 136 | .footer { 137 | margin-top: 50px; 138 | color: #777; 139 | } 140 | 141 | 142 | /* header */ 143 | 144 | h1 { 145 | margin: 1.25em 0 1.5em; 146 | text-align: center; 147 | } 148 | 149 | h1 a { 150 | display: block; 151 | margin: auto; 152 | padding: 0 2em; 153 | -webkit-transition: 0.8s all; 154 | -webkit-animation: leafanim 3s ease 3s 1 normal none; 155 | transition: 0.8s all; 156 | animation: leafanim 3s ease 3s 1 normal none; 157 | } 158 | 159 | @-webkit-keyframes leafanim { 160 | 50% { -webkit-filter: hue-rotate(-70deg) saturate(1.2); } 161 | } 162 | 163 | @keyframes leafanim { 164 | 50% { -webkit-filter: hue-rotate(-70deg) saturate(1.2); } 165 | } 166 | 167 | h1 a img { 168 | display: block; 169 | margin: auto; 170 | max-width: 100%; 171 | } 172 | 173 | h1 a:hover, h1 a:focus { 174 | -webkit-filter: hue-rotate(-70deg) saturate(1.5); 175 | } 176 | 177 | h3.tagline { 178 | font-weight: 300; 179 | font-size: 1.5em; 180 | margin-top: -.75em; 181 | padding: 0; 182 | color: #777; 183 | text-align: center; 184 | margin-bottom: 30px; 185 | } 186 | 187 | .nav { 188 | overflow: hidden; 189 | list-style: none; 190 | padding: 0 30px; 191 | text-align: center; 192 | font-size: 1.25em; 193 | margin-bottom: 40px; 194 | border-bottom: 1px solid #ddd; 195 | padding-bottom: 40px; 196 | } 197 | 198 | .nav li { 199 | display: inline-block; 200 | padding: .333em .5em; 201 | color: #999; 202 | } 203 | 204 | .nav li a { 205 | font-weight: 400; 206 | text-decoration: none; 207 | } 208 | 209 | .ext-links { 210 | position: fixed; 211 | top: 1.5em; 212 | right: 1.5em; 213 | } 214 | 215 | .ext-link { 216 | display: block; 217 | opacity: 0.5; 218 | -webkit-animation: fadein 1s; 219 | animation: fadein 1s; 220 | } 221 | .ext-link:hover { 222 | opacity: 1; 223 | } 224 | @-webkit-keyframes fadein { 225 | from { opacity: 0; } 226 | to { opacity: 0.5; } 227 | } 228 | @keyframes fadein { 229 | from { opacity: 0; } 230 | to { opacity: 0.5; } 231 | } 232 | 233 | 234 | /* content */ 235 | 236 | .container code, .container pre code { 237 | font-family: "Consolas", "Menlo", "Lucida Console", "Courier New", monospace; 238 | -webkit-font-smoothing: subpixel-antialiased; 239 | } 240 | .container pre code { 241 | font-size: 14px; 242 | padding: .75em 1em; 243 | border-radius: 5px; 244 | white-space: pre; 245 | overflow: auto; 246 | } 247 | .container pre { 248 | border-radius: 5px; 249 | } 250 | 251 | .container .map { 252 | border: 1px solid #ccc; 253 | } 254 | .container .map:focus { 255 | border-color: #999; 256 | } 257 | 258 | .quiet { 259 | color: #999; 260 | } 261 | 262 | 263 | /* frontpage */ 264 | 265 | .map-home { 266 | height: 300px; 267 | margin-top: 50px; 268 | margin-bottom: 50px; 269 | } 270 | 271 | .usedby-title { 272 | text-align: center; 273 | background-color: #f5f5f5; 274 | padding: 1.5em 1em 0.5em; 275 | margin: 0; 276 | } 277 | 278 | .usedby { 279 | margin: 0 0 3em; 280 | text-align: center; 281 | padding: 0 3em 2em; 282 | background-color: #f5f5f5; 283 | } 284 | 285 | .logo { 286 | display: inline-block; 287 | opacity: 0.6; 288 | height: 32px; 289 | overflow: hidden; 290 | text-indent: -9999px; 291 | margin: 1em; 292 | background: url(../images/logos.png); 293 | background-repeat: no-repeat; 294 | background-size: 100%; 295 | vertical-align: middle; 296 | -webkit-transition: opacity .15s ease; 297 | transition: opacity .15s ease; 298 | } 299 | 300 | .logo:hover { opacity: 1; } 301 | 302 | .logo-foursquare { 303 | background-position: 50% -4px; 304 | width: 135px; 305 | } 306 | 307 | .logo-pinterest { 308 | background-position: 50% -39px; 309 | width: 115px; 310 | } 311 | 312 | .logo-500px { 313 | background-position: 50% -48px; 314 | width: 52px; 315 | background-size: 80px; 316 | } 317 | 318 | .logo-evernote { 319 | background-position: 50% -169px; 320 | width: 170px; 321 | height: 43px; 322 | } 323 | 324 | .logo-ftimes { 325 | background-position: 50% -190px; 326 | width: 112px; 327 | height: 40px; 328 | background-size: 145px; 329 | } 330 | 331 | .logo-github { 332 | background-position: 50% -178px; 333 | width: 110px; 334 | } 335 | 336 | .logo-wpost { 337 | background-position: 50% -327px; 338 | width: 170px; 339 | } 340 | 341 | .logo-npr { 342 | background-position: 50% -214px; 343 | width: 100px; 344 | height: 34px; 345 | } 346 | 347 | .logo-usatoday { 348 | background-position: 50% -299px; 349 | width: 120px; 350 | height: 30px; 351 | } 352 | 353 | .logo-facebook { 354 | background-position: 50% -356px; 355 | width: 130px; 356 | } 357 | 358 | .logo-flickr { 359 | background-position: 50% -277px; 360 | width: 92px; 361 | height: 29px; 362 | } 363 | 364 | .logo-datagov { 365 | background-position: 50% -452px; 366 | width: 135px; 367 | height: 26px; 368 | } 369 | 370 | .logo-ign { 371 | background-position: 50% -393px; 372 | width: 110px; 373 | } 374 | 375 | .logo-etsy { 376 | background-position: 50% -428px; 377 | width: 57px; 378 | background-size: 110px; 379 | } 380 | 381 | .logo-european-commission { 382 | background-position: 50% -526px; 383 | width: 125px; 384 | } 385 | 386 | .logo-nps { 387 | background-position: 50% -483px; 388 | width: 32px; 389 | height: 40px; 390 | margin-top: .5em; 391 | margin-bottom: .5em; 392 | background-size: 106px; 393 | } 394 | 395 | .features { 396 | -webkit-column-count: 3; 397 | -moz-column-count: 3; 398 | column-count: 3; 399 | } 400 | .features ul { 401 | padding-left: 1.6em; 402 | margin: 0 0 1.8em; 403 | } 404 | .features h3 { 405 | margin: 0 0 0.8em; 406 | padding: 0; 407 | } 408 | .features h4 { 409 | margin: 0 0 0.3em; 410 | } 411 | 412 | 413 | /* tutorials */ 414 | 415 | .example-img { 416 | float: left; 417 | width: 14em; 418 | max-width: 100%; 419 | border-radius: 5px; 420 | margin: 0 1.5em 1.5em 0; 421 | border: thin solid #ccc; 422 | } 423 | 424 | .examples .container h3 { 425 | margin-top: 0; 426 | } 427 | .post-date { 428 | float: left; 429 | width: 130px; 430 | line-height: 1.6; 431 | color: #999; 432 | font-size: 18px; 433 | } 434 | .post-info { 435 | overflow: hidden; 436 | } 437 | .post-title { 438 | margin-top: 0; 439 | } 440 | 441 | 442 | /* plugins */ 443 | 444 | .plugins td:first-child, 445 | .plugins td:last-child a { 446 | white-space: nowrap; 447 | } 448 | 449 | table.plugins td:first-child a { 450 | font-weight: bold; 451 | } 452 | 453 | .plugins-page .toc-col { 454 | float: left; 455 | width: 25%; 456 | } 457 | 458 | 459 | /* API docs */ 460 | 461 | .api-page .toc-col { 462 | position: relative; 463 | float: left; 464 | width: 20%; 465 | padding-right: 1em; 466 | margin: 0; 467 | box-sizing: border-box; 468 | } 469 | 470 | .api-page .toc-col.map-col { 471 | border-right: thin solid #eee; 472 | } 473 | 474 | .api-page .toc-col.map-col ~ .toc-col { 475 | right: -1.5em; 476 | } 477 | 478 | .api-page #toc ~ h2 { 479 | font-weight: 700; 480 | font-size: 1.75em; 481 | color: #333; 482 | border-bottom: 3px solid #555; 483 | transition: border-color .25s ease; 484 | } 485 | .api-page #toc ~ h2:target { 486 | border-color: #1EB300; 487 | } 488 | .api-page h2:first-child { 489 | border: none; 490 | } 491 | 492 | #toc h4 { 493 | margin-top: 0; 494 | } 495 | 496 | #toc ul { 497 | padding: 0; 498 | list-style: none; 499 | margin-top: 0; 500 | margin-bottom: 25px; 501 | } 502 | 503 | #toc .colborder { 504 | padding-right: 14px; 505 | } 506 | 507 | #toc .span-3 { 508 | margin: 0; 509 | padding-right: 3em; 510 | width: 16.825%; 511 | box-sizing: border-box; 512 | } 513 | 514 | #toc .span-3.last { 515 | padding-right: 0; 516 | } 517 | 518 | #toc-copy { 519 | display: none; 520 | } 521 | 522 | #toc-copy div { 523 | border: 0; 524 | margin: 0; 525 | padding: 0; 526 | width: auto; 527 | float: none; 528 | } 529 | 530 | #toc-copy h4 { 531 | margin: 0; 532 | padding-bottom: .333em; 533 | } 534 | 535 | #toc-copy hr { 536 | background-color: transparent; 537 | margin: 0 0 .5em; 538 | } 539 | 540 | #toc-copy ul { 541 | display: none; 542 | list-style: none; 543 | } 544 | 545 | #toc-copy ul li { 546 | white-space: nowrap; 547 | } 548 | 549 | #toc-copy ul li a { 550 | position: relative; 551 | padding: .25em .5em 0; 552 | z-index: 10; 553 | } 554 | 555 | #toc-copy .toc-col { 556 | position: static; 557 | } 558 | 559 | @media screen and (max-width: 1350px) { 560 | #toc-copy { 561 | display: block; 562 | position: fixed; 563 | top: 0.1em; 564 | left: 0.25em; 565 | width: 32px; 566 | height: 32px; 567 | opacity: 0; 568 | cursor: pointer; 569 | -webkit-transition: opacity .2s ease; 570 | transition: opacity .2s ease; 571 | } 572 | 573 | #toc-copy > div { display: none; } 574 | 575 | .scrolled #toc-copy { 576 | opacity: 1; 577 | background: white; 578 | } 579 | 580 | #toc-copy.active { 581 | background-color: white; 582 | background-color: rgba(255, 255, 255, 0.9); 583 | padding: 2em; 584 | width: 100%; 585 | height: 100%; 586 | overflow-x: hidden; 587 | overflow-y: scroll; 588 | cursor: default; 589 | box-sizing: border-box; 590 | } 591 | 592 | #toc-copy:before, 593 | #toc-copy:after { 594 | content: ''; 595 | position: absolute; 596 | left: 5px; 597 | width: 22px; 598 | height: 14px; 599 | border-top: 2px solid black; 600 | cursor: pointer; 601 | box-sizing: border-box; 602 | -webkit-transition: -webkit-transform .25s ease; 603 | transition: transform .25s ease; 604 | } 605 | 606 | #toc-copy:before { 607 | top: 9px; 608 | border-bottom: 2px solid black; 609 | } 610 | 611 | #toc-copy:after { 612 | top: 15px; 613 | } 614 | 615 | #toc-copy.active:before { 616 | top: 5px; 617 | left: 9px; 618 | border-bottom: 0; 619 | -webkit-transform: rotate(-135deg); 620 | transform: rotate(-135deg); 621 | } 622 | 623 | #toc-copy.active:after { 624 | top: 13px; 625 | left: 9px; 626 | -webkit-transform: rotate(-45deg); 627 | transform: rotate(-45deg); 628 | } 629 | 630 | #toc-copy.active div { display: block; } 631 | 632 | #toc-copy h4.active, #toc-copy h4:hover { 633 | color: black; 634 | cursor: pointer; 635 | } 636 | 637 | #toc-copy h4.active + ul { 638 | display: block; 639 | padding: 0; 640 | margin: 0 0 .5em; 641 | } 642 | 643 | #toc-copy ul li a { padding: .25em 0; } 644 | } 645 | 646 | @media screen and (min-width: 900px) and (max-width: 1350px) { 647 | #toc-copy { 648 | width: 40px; 649 | height: 40px; 650 | } 651 | 652 | #toc-copy.active { 653 | padding: 2.5em; 654 | } 655 | 656 | #toc-copy:before, 657 | #toc-copy:after { 658 | left: 8px; 659 | } 660 | 661 | #toc-copy:before { top: 13px; } 662 | 663 | #toc-copy:after { top: 19px; } 664 | 665 | #toc-copy.active:before { 666 | top: 7px; 667 | left: 10px; 668 | } 669 | 670 | #toc-copy.active:after { 671 | top: 15px; 672 | left: 10px; 673 | } 674 | } 675 | 676 | @media screen and (min-width: 1350px) and (min-height: 600px) { 677 | #toc-copy { 678 | display: block; 679 | position: fixed; 680 | top: 0; 681 | left: 0; 682 | width: auto; 683 | height: auto; 684 | padding: 2em; 685 | opacity: 0; 686 | transition: opacity .25s ease; 687 | -webkit-transition: opacity .25s ease; 688 | } 689 | 690 | #toc-copy:before { 691 | content: 'Table of contents'; 692 | display: block; 693 | margin: -.25em 0 1em; 694 | font-size: 75%; 695 | font-weight: 300; 696 | text-transform: uppercase; 697 | } 698 | 699 | .scrolled #toc-copy { opacity: 1; } 700 | 701 | #toc-copy h4 { padding-right: 5em; } 702 | 703 | #toc-copy ul { 704 | position: absolute; 705 | left: 100%; 706 | margin: -4.9em 0 0 -4.5em; 707 | padding: 3em 6em 3em 0; 708 | } 709 | 710 | #toc-copy h4:hover + ul, 711 | #toc-copy ul:hover { 712 | display: block; 713 | } 714 | 715 | #toc-copy h4:hover + ul:before, 716 | #toc-copy ul:hover:before { 717 | content: ''; 718 | position: absolute; 719 | top: 3.775em; 720 | right: 100%; 721 | margin-right: .25em; 722 | width: 1em; 723 | height: 1em; 724 | border-top: 2px solid #eee; 725 | } 726 | 727 | #toc-copy h4:hover + ul:after, 728 | #toc-copy ul:hover:after { 729 | content: ''; 730 | position: absolute; 731 | z-index: -1; 732 | top: -1000px; 733 | bottom: -1000px; 734 | left: 0; 735 | width: 12.5em; 736 | background: white; 737 | background: rgba(255,255,255,0.9); 738 | } 739 | 740 | .plugins-page #toc-copy h4:hover + ul:after, 741 | .plugins-page #toc-copy ul:hover:after { 742 | width: 17em; 743 | } 744 | 745 | #toc-copy h4:hover, #toc-copy h4.hover { 746 | color: black; 747 | cursor: pointer; 748 | } 749 | } 750 | 751 | /* API docs - tables */ 752 | 753 | .api-page table td { 754 | color: #666; 755 | } 756 | .api-page table td:first-child { 757 | color: #777; 758 | } 759 | .api-page table td:last-child { 760 | color: black; 761 | } 762 | .api-page table td:last-child code { 763 | word-break: break-word; 764 | white-space: pre-wrap; 765 | } 766 | .api-page table td code i { 767 | color: #9a9; 768 | } 769 | .api-page table td code b { 770 | color: black; 771 | font-weight: normal; 772 | } 773 | .api-page table td, 774 | .api-page table th { 775 | font-size: 14px; 776 | } 777 | 778 | .api-page p { 779 | margin-top: 0; 780 | } 781 | 782 | tr:target { 783 | background: yellow; 784 | -webkit-animation: highlight 2s ease 0.5s 1 normal forwards; 785 | animation: highlight 2s ease 0.5s 1 normal forwards; 786 | } 787 | 788 | @-webkit-keyframes highlight { 789 | 0% { background: yellow; } 790 | 100% { background: white; } 791 | } 792 | @keyframes highlight { 793 | 0% { background: yellow; } 794 | 100% { background: white; } 795 | } 796 | 797 | .api-page h2[id]:before, 798 | .api-page tr[id] td:first-child:before { 799 | content: 'Permalink'; 800 | display: inline-block; 801 | margin: 0px 5px 0px -35px; 802 | width: 30px; 803 | height: 0; 804 | overflow: hidden; 805 | padding-top: 20px; 806 | line-height: 20px; 807 | vertical-align: baseline; 808 | background: url(../images/sprite.png) -0px -0px no-repeat; 809 | opacity: 0.2; 810 | border-radius: 50%; 811 | cursor: pointer; 812 | position: absolute; 813 | z-index: 1; 814 | } 815 | 816 | .api-page h2[id]:before { 817 | margin-left: -32px; 818 | margin-top: 14px; 819 | } 820 | 821 | .api-page tr[id] td:first-child:before { 822 | opacity: 0; 823 | } 824 | 825 | .api-page tr[id]:hover td:first-child:before { 826 | opacity: 1; 827 | } 828 | 829 | .api-page h2[id]:hover:before { opacity: 1; } 830 | 831 | @media (-webkit-min-device-pixel-ratio: 1.25),(min-resolution: 120dpi) { 832 | .api-page h2[id]:before, 833 | .api-page tr[id] td:first-child:before { 834 | background-image: url(../images/sprite.svg); 835 | } 836 | } 837 | 838 | @media screen and (max-width: 767px) { 839 | #toc .colborder { 840 | padding: 0; 841 | } 842 | 843 | .colborder { 844 | margin: 0; 845 | border: 0; 846 | } 847 | 848 | #toc .toc-col { 849 | width: 50%; 850 | float: none; 851 | position: static; 852 | display: inline-block; 853 | margin: 0; 854 | border: 0; 855 | padding-right: .5em; 856 | margin-right: -.25em; 857 | vertical-align: top; 858 | box-sizing: border-box; 859 | } 860 | 861 | .toc-col.last-col { 862 | clear: both; 863 | } 864 | 865 | th, 866 | td { 867 | border: 0; 868 | } 869 | 870 | tr { 871 | border-bottom: 1px solid #eee; 872 | } 873 | 874 | table.plugins tbody tr { 875 | display: block; 876 | padding-bottom: 1em; 877 | } 878 | 879 | table.plugins tbody tr td { 880 | white-space: normal; 881 | display: inline-block; 882 | padding-bottom: 0; 883 | } 884 | 885 | table.plugins tr:first-child { 886 | padding-bottom: 0; 887 | } 888 | 889 | table.plugins tr:first-child th { 890 | display: block; 891 | } 892 | 893 | table.plugins tr:first-child th ~ th { 894 | display: none; 895 | } 896 | 897 | table.plugins td:first-child { 898 | display: block; 899 | white-space: normal; 900 | } 901 | 902 | .api-page table tbody tr { 903 | display: block; 904 | } 905 | 906 | .api-page table tbody tr th, 907 | .api-page table tbody tr td { 908 | display: inline-block; 909 | background-color: transparent; 910 | width: auto; 911 | } 912 | 913 | .api-page table tr:first-child th ~ th { 914 | display: none; 915 | } 916 | 917 | .api-page table tbody tr th:nth-child(2), 918 | .api-page table tbody tr th:nth-child(3) { 919 | display: inline-block; 920 | } 921 | 922 | .api-page table tr th:last-child { 923 | display: none !important; 924 | } 925 | 926 | .api-page table tbody tr td:last-child { 927 | display: block; 928 | border-top: thin dashed #ddd; 929 | padding: 1em; 930 | } 931 | 932 | /*.api-page table tbody tr td:last-child:before { 933 | content: 'Description'; 934 | display: block; 935 | text-transform: uppercase; 936 | font-size: 90%; 937 | margin-bottom: .75em; 938 | color: #666; 939 | }*/ 940 | 941 | td code { 942 | word-break: break-word; 943 | } 944 | } 945 | 946 | @media screen and (max-width: 56em) { 947 | .container { 948 | padding: 0 2em 1.5em; 949 | } 950 | 951 | .footer, .social-buttons { 952 | text-align: center; 953 | } 954 | 955 | .footer { 956 | margin-top: 2em; 957 | } 958 | 959 | .ext-links { 960 | position: static; 961 | margin: 0 auto 2em; 962 | text-align: center; 963 | clear: both; 964 | } 965 | 966 | .ext-link { 967 | display: inline-block; 968 | vertical-align: middle; 969 | margin: .25em; 970 | } 971 | 972 | .features { 973 | -webkit-column-count: 2; 974 | -moz-column-count: 2; 975 | column-count: 2; 976 | } 977 | } 978 | 979 | @media screen and (max-width: 500px) { 980 | .nav { 981 | font-size: 1.25em; 982 | padding-bottom: 1em; 983 | line-height: 1; 984 | } 985 | 986 | h1 { 987 | margin: 1em 0; 988 | } 989 | 990 | h3.tagline { 991 | font-size: 1.05em; 992 | margin: 0 1em; 993 | } 994 | 995 | .container { 996 | padding: 0 1.5em 1.5em; 997 | } 998 | 999 | .logo { 1000 | margin: 0.6em; 1001 | } 1002 | 1003 | .usedby-title { 1004 | padding-top: 1em; 1005 | padding-bottom: 0.5em; 1006 | font-size: 1.8em; 1007 | } 1008 | 1009 | .usedby { 1010 | padding-left: 0; 1011 | padding-right: 0; 1012 | padding-bottom: 0; 1013 | } 1014 | 1015 | .features { 1016 | -webkit-column-count: 1; 1017 | -moz-column-count: 1; 1018 | column-count: 1; 1019 | } 1020 | 1021 | .example-img { 1022 | float: none; 1023 | display: block; 1024 | width: auto; 1025 | margin: 0 0 -.25em; 1026 | border: 0; 1027 | } 1028 | 1029 | .post-date { 1030 | float: none; 1031 | width: auto; 1032 | margin: 0 0 .333em; 1033 | } 1034 | 1035 | .api-page h2[id] { text-indent: 24px; } 1036 | .api-page h2[id]:before { margin-left: -28px; } 1037 | } 1038 | 1039 | .width250 { 1040 | width: 250px; 1041 | } 1042 | .width200 { 1043 | width: 200px; 1044 | } 1045 | .width300 { 1046 | width: 300px; 1047 | } 1048 | .width100 { 1049 | width: 100px; 1050 | } 1051 | .width140 { 1052 | width: 140px; 1053 | } 1054 | .minwidth { 1055 | width: 1px; 1056 | } 1057 | 1058 | .download-page table td a { 1059 | white-space: nowrap; 1060 | } 1061 | 1062 | .tutorials-back { 1063 | margin-bottom: -3em; 1064 | } 1065 | 1066 | .post-page h2 { 1067 | margin-top: 0; 1068 | } 1069 | 1070 | .post-meta { 1071 | color: #888; 1072 | margin-top: -1em; 1073 | } 1074 | 1075 | iframe[src*='youtube.com'] { 1076 | max-width: 100% !important; 1077 | } 1078 | 1079 | #disqus_thread { 1080 | margin-top: 3em; 1081 | } 1082 | 1083 | .no-break { 1084 | display: inline-block; 1085 | width: 100%; 1086 | } 1087 | 1088 | .announcement { 1089 | background: #eee; 1090 | padding: 5px 10px; 1091 | border-radius: 10px; 1092 | } 1093 | -------------------------------------------------------------------------------- /docs/vectorgrid-api-docs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Leaflet.VectorGrid API reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 |

Leaflet.VectorGrid API reference

18 |
19 |
20 | 25 |
26 | 34 |
35 | 36 |

VectorGrid.Slicer

A VectorGrid for slicing up big GeoJSON or TopoJSON documents in vector 37 | tiles, leveraging geojson-vt.

38 | 39 |
40 |

Usage example

41 | 42 |
43 | 44 | 45 | 46 | 47 | 48 |
var geoJsonDocument = {
 49 |     type: 'FeatureCollection',
 50 |     features: [ ... ]
 51 | };
 52 | L.vectorGrid.slicer(geoJsonDocument, {
 53 |     vectorTileLayerStyles: {
 54 |         sliced: { ... }
 55 |     }
 56 | }).addTo(map);
 57 | 

VectorGrid.Slicer can also handle TopoJSON transparently:

58 |
var layer = L.vectorGrid.slicer(topojson, options);
 59 | 
60 |

The TopoJSON format implicitly groups features into "objects". 61 | These will be transformed into vector tile layer names when styling (the 62 | vectorTileLayerName option is ignored when using TopoJSON).

63 | 64 | 65 | 66 |
67 | 68 | 69 |
70 |

Options

71 | 72 |
73 | 74 | 75 | 76 |
Additionally to these options, VectorGrid.Slicer can take in any 77 | of the geojson-vt options.
78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 91 | 94 | 95 |
OptionTypeDefaultDescription
vectorTileLayerNameString 90 | 'sliced'Vector tiles contain a set of data layers, and those data layers 92 | contain features. Thus, the slicer creates one data layer, with 93 | the name given in this option. This is important for symbolizing the data.
96 | 97 |
98 | 99 | 100 |

VectorGrid

A VectorGrid is a generic, abstract class for displaying tiled vector data. 101 | it provides facilities for symbolizing and rendering the data in the vector 102 | tiles, but lacks the functionality to fetch the vector tiles from wherever 103 | they are. 104 | Extends Leaflet's L.GridLayer.

105 | 106 |
107 |

Options

108 | 109 |
110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 126 | 127 | 128 | 129 | 130 | 132 | 133 | 134 | 135 | 136 | 138 | 139 | 140 | 141 | 142 | 144 | 147 | 148 |
OptionTypeDefaultDescription
rendererFactory 125 | L.svg.tileA factory method which will be used to instantiate the per-tile renderers.
vectorTileLayerStylesObject 131 | {}A data structure holding initial symbolizer definitions for the vector features.
interactiveBoolean 137 | falseWhether this VectorGrid fires Interactive Layer events.
getFeatureIdFunction 143 | undefinedA function that, given a vector feature, returns an unique identifier for it, e.g. 145 | function(feat) { return feat.properties.uniqueIdField; }. 146 | Must be defined for setFeatureStyle to work.
149 | 150 |
151 | 152 | 153 |
154 |

Methods

155 | 156 |
157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 175 | 176 | 177 | 178 | 179 | 182 | 183 |
MethodReturnsDescription
setFeatureStyle(<Number> id, <L.Path Options> layerStyle)this

Given the unique ID for a vector features (as per the getFeatureId option), 172 | re-symbolizes that feature across all tiles it appears in. 173 | Reverts the effects of a previous setFeatureStyle call.

174 |
getDataLayerNames()Array

Returns an array of strings, with all the known names of data layers in 180 | the vector tiles displayed. Useful for introspection.

181 |
184 | 185 |
186 | 187 |

Extension methods

188 | 189 |
Classes inheriting from VectorGrid must define the _getVectorTilePromise private method.
190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 204 | 205 |
MethodReturnsDescription
getVectorTilePromise(<Object> coords)Promise

Given a coords object in the form of {x: Number, y: Number, z: Number}, 202 | this function must return a Promise for a vector tile.

203 |
206 | 207 |
208 | 209 | 210 |

FillSymbolizer

A symbolizer for filled areas. Applies only to polygon features.

211 | 212 |

VectorGrid.Protobuf

A VectorGrid for vector tiles fetched from the internet. 213 | Tiles are supposed to be protobufs (AKA "protobuffer" or "Protocol Buffers"), 214 | containing data which complies with the 215 | MapBox Vector Tile Specification. 216 | This is the format used by:

217 | 223 | 224 |
225 |

Usage example

226 | 227 |
228 | 229 | 230 | 231 | 232 | 233 |

You must initialize a VectorGrid.Protobuf with a URL template, just like in 234 | L.TileLayers. The difference is that the template must point to vector tiles 235 | (usually .pbf or .mvt) instead of raster (.png or .jpg) tiles, and that 236 | you should define the styling for all the features. 237 |

238 | For OpenMapTiles, with a key from https://openmaptiles.org/docs/host/use-cdn/, 239 | initialization looks like this:

240 |
L.vectorGrid.protobuf("https://free-{s}.tilehosting.com/data/v3/{z}/{x}/{y}.pbf.pict?key={key}", {
241 |     vectorTileLayerStyles: { ... },
242 |     subdomains: "0123",
243 |     key: 'abcdefghi01234567890',
244 |     maxNativeZoom: 14
245 | }).addTo(map);
246 | 

And for Mapbox vector tiles, it looks like this:

247 |
L.vectorGrid.protobuf("https://{s}.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6/{z}/{x}/{y}.vector.pbf?access_token={token}", {
248 |     vectorTileLayerStyles: { ... },
249 |     subdomains: "abcd",
250 |     token: "pk.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTS.TUVWXTZ0123456789abcde"
251 | }).addTo(map);
252 | 
253 | 254 | 255 |
256 | 257 | 258 |
259 |

Creation

260 | 261 |
262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 |
FactoryDescription
L.vectorGrid.protobuf(<String> url, options)Instantiates a new protobuf VectorGrid with the given URL template and options
277 | 278 |
279 | 280 | 281 |
282 |

Options

283 | 284 |
285 | 286 | 287 | 288 |
As with L.TileLayer, the URL template might contain a reference to 289 | any option (see the example above and note the {key} or token in the URL 290 | template, and the corresponding option).
291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 304 | 305 | 306 |
OptionTypeDefaultDescription
subdomainsString 303 | 'abc'Akin to the subdomains option for L.TileLayer.
307 | 308 |
309 | 310 | 311 |

LineSymbolizer

A symbolizer for lines. Can be applied to line and polygon features.

312 | 313 |

PointSymbolizer

A symbolizer for points.

314 | 315 |

Symbolizer

The abstract Symbolizer class is mostly equivalent in concept to a L.Path - it's an interface for 316 | polylines, polygons and circles. But instead of representing leaflet Layers, 317 | it represents things that have to be drawn inside a vector tile.

318 | 319 |
320 |

Methods

321 | 322 |
323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 340 | 341 | 342 | 343 | 344 | 349 | 350 |
MethodReturnsDescription
initialize(<GeoJSON> feature, <Number> pxPerExtent)

Initializes a new Line Symbolizer given a GeoJSON feature and the 338 | pixel-to-coordinate-units ratio. Internal use only.

339 |
render(renderer, style)

Renders this symbolizer in the given tiled renderer, with the given 345 | L.Path options. Internal use only. 346 | Updates the L.Path options used to style this symbolizer, and re-renders it. 347 | Internal use only.

348 |
351 | 352 |
353 | 354 | 355 |

Styling VectorGrids

Vector tiles have a concept of "layer" different from the Leaflet concept of "layer". 356 |
357 | In Leaflet, a "layer" is something that can be atomically added or removed from the map. In vector tiles, a "layer" is a named set of features (points, lines or polygons) which share a common theme. 358 |
359 | A vector tile layer¹ can have several layers². In the mapbox-streets-v6 vector tiles layer¹ above, there are named layers² like admin, water or roads. 360 |
361 | (¹ In Leaflet) 362 |
363 | (² Groups of themed features) 364 |
365 | Styling is done via per-layer² sets of L.Path options in the vectorTileLayerStyles layer¹ option:

366 |
var vectorTileOptions = {
367 |     vectorTileLayerStyles: {
368 |         // A plain set of L.Path options.
369 |         landuse: {
370 |             weight: 0,
371 |             fillColor: '#9bc2c4',
372 |             fillOpacity: 1,
373 |             fill: true
374 |         },
375 |         // A function for styling features dynamically, depending on their
376 |         // properties and the map's zoom level
377 |         admin: function(properties, zoom) {
378 |             var level = properties.admin_level;
379 |             var weight = 1;
380 |             if (level == 2) {weight = 4;}
381 |             return {
382 |                 weight: weight,
383 |                 color: '#cf52d3',
384 |                 dashArray: '2, 6',
385 |                 fillOpacity: 0
386 |             }
387 |         },
388 |         // A function for styling features dynamically, depending on their
389 |         // properties, the map's zoom level, and the layer's geometry
390 |         // dimension (point, line, polygon)
391 |         water: function(properties, zoom, geometryDimension) {
392 | 	    if (geometryDimension === 1) {   // point
393 | 	        return ({
394 |                     radius: 5,
395 |                     color: '#cf52d3',
396 |                 });
397 | 	    }
398 | 	    
399 | 	    if (geometryDimension === 2) {   // line
400 |                  return ({
401 |                     weight: 1,
402 |                     color: '#cf52d3',
403 |                     dashArray: '2, 6',
404 |                     fillOpacity: 0
405 |                 });
406 | 	    }
407 | 	    
408 | 	    if (geometryDimension === 3) {   // polygon
409 | 	         return ({
410 |                     weight: 1,
411 |                     fillColor: '#9bc2c4',
412 |                     fillOpacity: 1,
413 |                     fill: true
414 |                 });
415 | 	    }
416 |         },
417 |         // An 'icon' option means that a L.Icon will be used
418 |         place: {
419 |             icon: new L.Icon.Default()
420 |         },
421 |         road: []
422 |     }
423 | };
424 | var pbfLayer = L.vectorGrid.protobuf(url, vectorTileOptions).addTo(map);
425 | 
426 |

A layer² style can be either:

427 |
    428 |
  • A set of L.Path options
  • 429 |
  • An array of sets of L.Path options
  • 430 |
  • A function that returns a set of L.Path options
  • 431 |
  • A function that returns an array of sets of L.Path options for point, line, and polygon styles respectively 432 |
    433 | Layers² with no style specified will use the default L.Path options. 434 |
    435 | Polylines and polygons can be styled exactly like normal Leaflet L.Paths, points can be styled like polygons using L.CircleMarkers or L.Icons.
  • 436 |
437 | 438 |

Updating Styles

In some cases it can be desirable to change the style of a feature on screen, for example for highlighting when a feature is clicked. 439 |
440 | To do this, VectorGrid needs to know how to identify a feature. This is done through the getFeatureId option, which should be set to a function 441 | that returns an id given a feature as argument. For example:

442 |
var vectorGrid = L.vectorGrid.slicer(url, {
443 |     ...
444 |     getFeatureId: function(f) {
445 |         return f.properties.osm_id;
446 |     }
447 | }
448 | 
449 |

Note that features with the same id will be treated as one when changing style, this happens normally when for example a polygon spans more than one tile. 450 |
451 | To update the style of a feature, use setFeatureStyle:

452 |
vectorGrid.setFeatureStyle(id, style);
453 | 
454 |

The styling follows the same rules as described above, it accepts a single style, an array, or a function that returns styling. 455 |
456 | To revert the style to the layer's default, use the resetFeatureStyle method:

457 |
vectorGrid.resetFeatureStyle(id);
458 | 
459 | 460 |

Interactivity

You can enable interacting (click, mouseover, etc.) with layer features if you pass the option interactive: true; you can then add listeners to the VectorGrid layer. When 461 | an event fires, it will include the layer property, containing information about the feature.

462 | 463 |

SVG vs canvas

Leaflet.VectorGrid is able to render vector tiles with both SVG and <canvas>, in the same way that vanilla Leaflet can use SVG and <canvas> to draw lines and polygons. 464 |
465 | To switch between the two, use the rendererFactory option for any L.VectorGrid layer, e.g.:

466 |
var sliced = L.vectorGrid.slicer(geojson, {
467 |     rendererFactory: L.svg.tile,
468 |     attribution: 'Something',
469 |     vectorTileLayerStyles: { ... }
470 | });
471 | var pbf = L.vectorGrid.protobuf(url, {
472 |     rendererFactory: L.canvas.tile,
473 |     attribution: 'Something',
474 |     vectorTileLayerStyles: { ... }
475 | });
476 | 
477 |

Internally, Leaflet.VectorGrid uses two classes named L.SVG.Tile and L.Canvas.Tile, with factory methods L.svg.tile and L.canvas.tile - a L.VectorGrid needs to be passed one of those factory methods.

478 | 479 | 480 | 481 | 484 | 485 |
486 | 487 | 488 | 539 | 656 | 657 | -------------------------------------------------------------------------------- /gobblefile.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | var gobble = require('gobble'); 4 | var src = gobble('src'); 5 | 6 | 7 | // Run rollup on the web worker code, in order to include GeoJSON-vt and TopoJSON into it. 8 | var concatenatedWebWorker = src.transform('rollup', { 9 | entry: 'slicerWebWorker.js', 10 | dest: 'slicerWebWorker.js.worker', 11 | format: 'cjs', 12 | sourceMap: true, 13 | plugins: [ 14 | require('rollup-plugin-buble')({ 15 | include: '**/**.js' 16 | }), 17 | require('rollup-plugin-node-resolve')({ 18 | jsnext: false, 19 | main: true 20 | }), 21 | require('rollup-plugin-commonjs')(), 22 | // require('rollup-plugin-file-as-blob')({ 23 | // include: '**/**.png' 24 | // }), 25 | ] 26 | }); 27 | 28 | var uglifiedWebWorker = src.transform('rollup', { 29 | entry: 'slicerWebWorker.js', 30 | dest: 'slicerWebWorker.js.worker', 31 | format: 'cjs', 32 | sourceMap: false, 33 | plugins: [ 34 | require('rollup-plugin-buble')({ 35 | include: '**/**.js' 36 | }), 37 | require('rollup-plugin-node-resolve')({ 38 | jsnext: false, 39 | main: true 40 | }), 41 | require('rollup-plugin-commonjs')(), 42 | require('rollup-plugin-uglify')() 43 | ] 44 | }); 45 | 46 | // Get the rolled-up worker code back next to the same directory as the main code 47 | var src2 = gobble([src, concatenatedWebWorker]); 48 | var src2uglified = gobble([src, uglifiedWebWorker]); 49 | 50 | 51 | // We'll run rollup four times, with slightly different options and using different 52 | // source files (uglified worker or not). But the plugins stay the same. 53 | var rollupPluginOptions = [ 54 | require('rollup-plugin-file-as-blob')({ 55 | // Note the '.*' at the beginning of the minimatch, because 56 | // https://github.com/rollup/rollup-pluginutils/issues/9 57 | include: '.*/**/**.worker' 58 | }), 59 | require('rollup-plugin-buble')({ 60 | include: '**/**.js' 61 | }), 62 | require('rollup-plugin-node-resolve')({ 63 | jsnext: false, 64 | main: true 65 | }), 66 | require('rollup-plugin-commonjs')(), 67 | ]; 68 | 69 | var rollupUglyPluginOptions = rollupPluginOptions.concat([require('rollup-plugin-uglify')()]); 70 | 71 | // Roll up the main code, merging the web worker code as a blob URL. 72 | var builtCode = src2.transform('rollup', { 73 | entry: 'bundle.js', 74 | dest: 'Leaflet.VectorGrid.js', 75 | format: 'cjs', 76 | sourceMap: true, 77 | plugins: rollupPluginOptions 78 | }); 79 | 80 | 81 | // Roll up the main code plus the optional bundled deps, merging the web worker code as a blob URL. 82 | var bundledCode = src2.transform('rollup', { 83 | entry: 'bundle-extra.js', 84 | dest: 'Leaflet.VectorGrid.bundled.js', 85 | format: 'iife', 86 | sourceMap: true, 87 | plugins: rollupPluginOptions, 88 | globals: { 89 | Pbf: 'Pbf', 90 | VectorTile: 'vector-tile', 91 | } 92 | }); 93 | 94 | 95 | var uglifiedCode = src2uglified.transform('rollup', { 96 | entry: 'bundle.js', 97 | dest: 'Leaflet.VectorGrid.min.js', 98 | format: 'cjs', 99 | sourceMap: false, 100 | plugins: rollupUglyPluginOptions 101 | }); 102 | 103 | 104 | var uglifiedBundledCode = src2uglified.transform('rollup', { 105 | entry: 'bundle-extra.js', 106 | dest: 'Leaflet.VectorGrid.bundled.min.js', 107 | format: 'cjs', 108 | sourceMap: false, 109 | plugins: rollupUglyPluginOptions 110 | }); 111 | 112 | 113 | var leafdoc = src.transform('leafdoc', { 114 | templateDir: 'leafdoc-templates', 115 | output: 'vectorgrid-api-docs.html', 116 | showInheritancesWhenEmpty: true, 117 | 118 | }); 119 | 120 | // var leaflet = vendor.include([ 121 | // 'leaflet-src.js', 122 | // 'leaflet-src.map', 123 | // 'leaflet.css' 124 | // ]).moveTo('demo'); 125 | 126 | 127 | module.exports = gobble([ 128 | builtCode, // No extra deps, no minified 129 | bundledCode, // Extra deps, no minified 130 | uglifiedCode, // No extra deps, minified 131 | uglifiedBundledCode, // Extra deps, minified 132 | 133 | // leaflet 134 | leafdoc 135 | ]); 136 | -------------------------------------------------------------------------------- /leafdoc-templates/comments.hbs: -------------------------------------------------------------------------------- 1 | {{{rawmarkdown comments}}} -------------------------------------------------------------------------------- /leafdoc-templates/constructor.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{#each documentables}} 8 | 9 | 14 | 15 | 16 | {{/each}} 17 |
ConstructorDescription
{{name}}( 10 | {{~#each params~}} 11 | {{#if type}}<{{{type type}}}> {{/if}}{{name}} 12 | {{~#unless @last}}, {{/unless}}{{/each~}} 13 | ){{{markdown comments}}}
18 | -------------------------------------------------------------------------------- /leafdoc-templates/crs.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{#each documentables}} 8 | 9 | 10 | 11 | 12 | {{/each}} 13 |
CRSDescription
{{name}}{{{markdown comments}}}
-------------------------------------------------------------------------------- /leafdoc-templates/destructor.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{#each documentables}} 8 | 9 | 14 | 15 | 16 | {{/each}} 17 |
DestructorDescription
{{name}}( 10 | {{~#each params~}} 11 | {{#if type}}<{{{type type}}}> {{/if}}{{name}} 12 | {{~#unless @last}}, {{/unless}}{{/each~}} 13 | ){{{markdown comments}}}
18 | -------------------------------------------------------------------------------- /leafdoc-templates/event.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{#each documentables}} 9 | 10 | 12 | 13 | 14 | {{/each}} 15 |
EventDataDescription
{{name}} 11 | {{{type type}}}{{{markdown comments}}}
-------------------------------------------------------------------------------- /leafdoc-templates/example.hbs: -------------------------------------------------------------------------------- 1 | 2 | {{#each documentables}} 3 | {{{rawmarkdown comments}}} 4 | {{/each}} -------------------------------------------------------------------------------- /leafdoc-templates/factory.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{#each documentables}} 8 | 9 | 14 | 15 | 16 | {{/each}} 17 |
FactoryDescription
{{name}}( 10 | {{~#each params~}} 11 | {{#if type}}<{{{type type}}}> {{/if}}{{name}} 12 | {{~#unless @last}}, {{/unless}}{{/each~}} 13 | ){{{markdown comments}}}
-------------------------------------------------------------------------------- /leafdoc-templates/function.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{#each documentables}} 9 | 10 | 15 | 16 | 17 | 18 | {{/each}} 19 |
FunctionReturnsDescription
{{name}}( 11 | {{~#each params~}} 12 | {{#if type}}<{{{type type}}}> {{/if}}{{name}} 13 | {{~#unless @last}}, {{/unless}}{{/each~}} 14 | ){{{type type}}}{{{markdown comments}}}
-------------------------------------------------------------------------------- /leafdoc-templates/html.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Leaflet.VectorGrid API reference 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 |

Leaflet.VectorGrid API reference

18 |
19 |
20 | 25 |
26 | 34 |
35 | 36 | {{{ body }}} 37 | 38 | 41 | 42 |
43 | 44 | 45 | 96 | 213 | 214 | -------------------------------------------------------------------------------- /leafdoc-templates/inherited.hbs: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 |
{{{inherited}}}
6 |
7 |
8 | -------------------------------------------------------------------------------- /leafdoc-templates/method.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{#each documentables}} 9 | 10 | 15 | 16 | 17 | 18 | {{/each}} 19 |
MethodReturnsDescription
{{name}}( 11 | {{~#each params~}} 12 | {{#if type}}<{{{type type}}}> {{/if}}{{name}} 13 | {{~#unless @last}}, {{/unless}}{{/each~}} 14 | ){{{type type}}}{{{rawmarkdown comments}}}
-------------------------------------------------------------------------------- /leafdoc-templates/namespace.hbs: -------------------------------------------------------------------------------- 1 | {{#if name ~}} 2 |

{{name}}

3 | {{~ else ~}} 4 | 5 | {{/if}} 6 | {{{rawmarkdown comments}}} 7 | {{{supersections}}} -------------------------------------------------------------------------------- /leafdoc-templates/option.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | {{#each documentables}} 10 | 11 | 12 | 14 | 15 | 16 | {{/each}} 17 |
OptionTypeDefaultDescription
{{name}}{{{type type}}} 13 | {{defaultValue}}{{{markdown comments}}}
-------------------------------------------------------------------------------- /leafdoc-templates/pane.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | {{#each documentables}} 10 | 11 | 12 | 14 | 15 | 16 | {{/each}} 17 |
PaneTypeZ-indexDescription
{{name}}{{{type type}}} 13 | {{defaultValue}}{{{markdown comments}}}
-------------------------------------------------------------------------------- /leafdoc-templates/projection.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{#each documentables}} 8 | 9 | 10 | 11 | 12 | {{/each}} 13 |
ProjectionDescription
{{name}}{{{markdown comments}}}
-------------------------------------------------------------------------------- /leafdoc-templates/property.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{#each documentables}} 9 | 10 | 12 | 13 | 14 | {{/each}} 15 |
PropertyTypeDescription
{{name}} 11 | {{{type type}}}{{{markdown comments}}}
-------------------------------------------------------------------------------- /leafdoc-templates/section.hbs: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{#if name}}

{{name}}

{{/if}} 4 | 5 | {{#if comments~}} 6 |
{{{markdown comments}}}
7 | {{/if}} 8 | 9 | {{{documentables}}} 10 | 11 |
-------------------------------------------------------------------------------- /leafdoc-templates/supersection.hbs: -------------------------------------------------------------------------------- 1 |
2 |

{{name}}

3 | {{markdown comments}} 4 | {{{sections}}} 5 | 6 | {{{inheritances}}} 7 |
-------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "leaflet.vectorgrid", 3 | "version": "1.3.0", 4 | "description": "Display gridded vector data (sliced GeoJSON or protobuf vector tiles) in Leaflet 1.0", 5 | "main": "dist/Leaflet.VectorGrid.bundled.min.js", 6 | "scripts": { 7 | "test": "exit 0", 8 | "prepublish": "node_modules/.bin/gobble build -f dist/", 9 | "build": "node_modules/.bin/gobble build -f dist/", 10 | "lint": "eslint src", 11 | "lintfix": "eslint --fix src", 12 | "start": "node_modules/.bin/gobble" 13 | }, 14 | "keywords": [ 15 | "leaflet", 16 | "vector", 17 | "geojson", 18 | "topojson" 19 | ], 20 | "authors": [ 21 | "Iván Sánchez Ortega ", 22 | "Per Liedman " 23 | ], 24 | "license": "Beerware", 25 | "repository": { 26 | "type": "git", 27 | "url": "https://github.com/IvanSanchez/Leaflet.VectorGrid.git" 28 | }, 29 | "bugs": { 30 | "url": "https://github.com/IvanSanchez/Leaflet.VectorGrid/issues" 31 | }, 32 | "devDependencies": { 33 | "eslint": "^4.19.0", 34 | "geojson-vt": "=2.2.0", 35 | "gobble": "=0.11.3", 36 | "gobble-cli": "=0.7.0", 37 | "gobble-leafdoc": "=0.1.8", 38 | "gobble-rollup": "=0.36.0", 39 | "rollup-plugin-buble": "=0.14.0", 40 | "rollup-plugin-commonjs": "=5.0.5", 41 | "rollup-plugin-file-as-blob": "=1.1.2", 42 | "rollup-plugin-node-resolve": "=2.0.0", 43 | "rollup-plugin-uglify": "=1.0.1" 44 | }, 45 | "dependencies": { 46 | "@mapbox/vector-tile": "^1.3.0", 47 | "pbf": "^3.0.2", 48 | "topojson-client": "^2.1.0", 49 | "whatwg-fetch": "^2.0.3" 50 | }, 51 | "peerDependencies": { 52 | "leaflet": "^1.0.2" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/Leaflet.Renderer.Canvas.Tile.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | L.Canvas.Tile = L.Canvas.extend({ 4 | 5 | initialize: function (tileCoord, tileSize, options) { 6 | L.Canvas.prototype.initialize.call(this, options); 7 | this._tileCoord = tileCoord; 8 | this._size = tileSize; 9 | 10 | this._initContainer(); 11 | this._container.setAttribute('width', this._size.x); 12 | this._container.setAttribute('height', this._size.y); 13 | this._layers = {}; 14 | this._drawnLayers = {}; 15 | this._drawing = true; 16 | 17 | if (options.interactive) { 18 | // By default, Leaflet tiles do not have pointer events 19 | this._container.style.pointerEvents = 'auto'; 20 | } 21 | }, 22 | 23 | getCoord: function() { 24 | return this._tileCoord; 25 | }, 26 | 27 | getContainer: function() { 28 | return this._container; 29 | }, 30 | 31 | getOffset: function() { 32 | return this._tileCoord.scaleBy(this._size).subtract(this._map.getPixelOrigin()); 33 | }, 34 | 35 | onAdd: L.Util.falseFn, 36 | 37 | addTo: function(map) { 38 | this._map = map; 39 | }, 40 | 41 | removeFrom: function (map) { 42 | delete this._map; 43 | }, 44 | 45 | _onClick: function (e) { 46 | var point = this._map.mouseEventToLayerPoint(e).subtract(this.getOffset()), layer, clickedLayer; 47 | 48 | for (var id in this._layers) { 49 | layer = this._layers[id]; 50 | if (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) { 51 | clickedLayer = layer; 52 | } 53 | } 54 | if (clickedLayer) { 55 | L.DomEvent.stop(e); 56 | this._fireEvent([clickedLayer], e); 57 | } 58 | }, 59 | 60 | _onMouseMove: function (e) { 61 | if (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; } 62 | 63 | var point = this._map.mouseEventToLayerPoint(e).subtract(this.getOffset()); 64 | this._handleMouseHover(e, point); 65 | }, 66 | 67 | /// TODO: Modify _initPath to include an extra parameter, a group name 68 | /// to order symbolizers by z-index 69 | 70 | _updateIcon: function (layer) { 71 | if (!this._drawing) { return; } 72 | 73 | var icon = layer.options.icon, 74 | options = icon.options, 75 | size = L.point(options.iconSize), 76 | anchor = options.iconAnchor || 77 | size && size.divideBy(2, true), 78 | p = layer._point.subtract(anchor), 79 | ctx = this._ctx, 80 | img = layer._getImage(); 81 | 82 | if (img.complete) { 83 | ctx.drawImage(img, p.x, p.y, size.x, size.y); 84 | } else { 85 | L.DomEvent.on(img, 'load', function() { 86 | ctx.drawImage(img, p.x, p.y, size.x, size.y); 87 | }); 88 | } 89 | 90 | this._drawnLayers[layer._leaflet_id] = layer; 91 | } 92 | }); 93 | 94 | 95 | L.canvas.tile = function(tileCoord, tileSize, opts){ 96 | return new L.Canvas.Tile(tileCoord, tileSize, opts); 97 | } 98 | 99 | -------------------------------------------------------------------------------- /src/Leaflet.Renderer.SVG.Tile.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | L.SVG.Tile = L.SVG.extend({ 4 | 5 | initialize: function (tileCoord, tileSize, options) { 6 | L.SVG.prototype.initialize.call(this, options); 7 | this._tileCoord = tileCoord; 8 | this._size = tileSize; 9 | 10 | this._initContainer(); 11 | this._container.setAttribute('width', this._size.x); 12 | this._container.setAttribute('height', this._size.y); 13 | this._container.setAttribute('viewBox', [0, 0, this._size.x, this._size.y].join(' ')); 14 | 15 | this._layers = {}; 16 | }, 17 | 18 | getCoord: function() { 19 | return this._tileCoord; 20 | }, 21 | 22 | getContainer: function() { 23 | return this._container; 24 | }, 25 | 26 | onAdd: L.Util.falseFn, 27 | 28 | addTo: function(map) { 29 | this._map = map; 30 | if (this.options.interactive) { 31 | for (var i in this._layers) { 32 | var layer = this._layers[i]; 33 | // By default, Leaflet tiles do not have pointer events. 34 | layer._path.style.pointerEvents = 'auto'; 35 | this._map._targets[L.stamp(layer._path)] = layer; 36 | } 37 | } 38 | }, 39 | 40 | removeFrom: function (map) { 41 | if (this.options.interactive) { 42 | for (var i in this._layers) { 43 | var layer = this._layers[i]; 44 | delete this._map._targets[L.stamp(layer._path)]; 45 | } 46 | } 47 | delete this._map; 48 | }, 49 | 50 | _initContainer: function() { 51 | L.SVG.prototype._initContainer.call(this); 52 | var rect = L.SVG.create('rect'); 53 | }, 54 | 55 | /// TODO: Modify _initPath to include an extra parameter, a group name 56 | /// to order symbolizers by z-index 57 | 58 | _addPath: function (layer) { 59 | this._rootGroup.appendChild(layer._path); 60 | this._layers[L.stamp(layer)] = layer; 61 | }, 62 | 63 | _updateIcon: function (layer) { 64 | var path = layer._path = L.SVG.create('image'), 65 | icon = layer.options.icon, 66 | options = icon.options, 67 | size = L.point(options.iconSize), 68 | anchor = options.iconAnchor || 69 | size && size.divideBy(2, true), 70 | p = layer._point.subtract(anchor); 71 | path.setAttribute('x', p.x); 72 | path.setAttribute('y', p.y); 73 | path.setAttribute('width', size.x + 'px'); 74 | path.setAttribute('height', size.y + 'px'); 75 | path.setAttribute('href', options.iconUrl); 76 | } 77 | }); 78 | 79 | 80 | L.svg.tile = function(tileCoord, tileSize, opts){ 81 | return new L.SVG.Tile(tileCoord, tileSize, opts); 82 | } 83 | 84 | -------------------------------------------------------------------------------- /src/Leaflet.VectorGrid.Protobuf.js: -------------------------------------------------------------------------------- 1 | 2 | import Pbf from 'pbf'; 3 | import {VectorTile} from '@mapbox/vector-tile'; 4 | 5 | /* 6 | * 🍂class VectorGrid.Protobuf 7 | * 🍂extends VectorGrid 8 | * 9 | * A `VectorGrid` for vector tiles fetched from the internet. 10 | * Tiles are supposed to be protobufs (AKA "protobuffer" or "Protocol Buffers"), 11 | * containing data which complies with the 12 | * [MapBox Vector Tile Specification](https://github.com/mapbox/vector-tile-spec/tree/master/2.1). 13 | * 14 | * This is the format used by: 15 | * - Mapbox Vector Tiles 16 | * - Mapzen Vector Tiles 17 | * - ESRI Vector Tiles 18 | * - [OpenMapTiles hosted Vector Tiles](https://openmaptiles.com/hosting/) 19 | * 20 | * 🍂example 21 | * 22 | * You must initialize a `VectorGrid.Protobuf` with a URL template, just like in 23 | * `L.TileLayer`s. The difference is that the template must point to vector tiles 24 | * (usually `.pbf` or `.mvt`) instead of raster (`.png` or `.jpg`) tiles, and that 25 | * you should define the styling for all the features. 26 | * 27 | *

28 | * 29 | * For OpenMapTiles, with a key from [https://openmaptiles.org/docs/host/use-cdn/](https://openmaptiles.org/docs/host/use-cdn/), 30 | * initialization looks like this: 31 | * 32 | * ``` 33 | * L.vectorGrid.protobuf("https://free-{s}.tilehosting.com/data/v3/{z}/{x}/{y}.pbf.pict?key={key}", { 34 | * vectorTileLayerStyles: { ... }, 35 | * subdomains: "0123", 36 | * key: 'abcdefghi01234567890', 37 | * maxNativeZoom: 14 38 | * }).addTo(map); 39 | * ``` 40 | * 41 | * And for Mapbox vector tiles, it looks like this: 42 | * 43 | * ``` 44 | * L.vectorGrid.protobuf("https://{s}.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6/{z}/{x}/{y}.vector.pbf?access_token={token}", { 45 | * vectorTileLayerStyles: { ... }, 46 | * subdomains: "abcd", 47 | * token: "pk.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTS.TUVWXTZ0123456789abcde" 48 | * }).addTo(map); 49 | * ``` 50 | */ 51 | L.VectorGrid.Protobuf = L.VectorGrid.extend({ 52 | 53 | options: { 54 | // 🍂section 55 | // As with `L.TileLayer`, the URL template might contain a reference to 56 | // any option (see the example above and note the `{key}` or `token` in the URL 57 | // template, and the corresponding option). 58 | // 59 | // 🍂option subdomains: String = 'abc' 60 | // Akin to the `subdomains` option for `L.TileLayer`. 61 | subdomains: 'abc', // Like L.TileLayer 62 | // 63 | // 🍂option fetchOptions: Object = {} 64 | // options passed to `fetch`, e.g. {credentials: 'same-origin'} to send cookie for the current domain 65 | fetchOptions: {} 66 | }, 67 | 68 | initialize: function(url, options) { 69 | // Inherits options from geojson-vt! 70 | // this._slicer = geojsonvt(geojson, options); 71 | this._url = url; 72 | L.VectorGrid.prototype.initialize.call(this, options); 73 | }, 74 | 75 | // 🍂method setUrl(url: String, noRedraw?: Boolean): this 76 | // Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`). 77 | setUrl: function(url, noRedraw) { 78 | this._url = url; 79 | 80 | if (!noRedraw) { 81 | this.redraw(); 82 | } 83 | 84 | return this; 85 | }, 86 | 87 | _getSubdomain: L.TileLayer.prototype._getSubdomain, 88 | 89 | _isCurrentTile : function(coords, tileBounds) { 90 | 91 | if (!this._map) { 92 | return true; 93 | } 94 | 95 | var zoom = this._map._animatingZoom ? this._map._animateToZoom : this._map._zoom; 96 | var currentZoom = zoom === coords.z; 97 | 98 | var tileBounds = this._tileCoordsToBounds(coords); 99 | var currentBounds = this._map.getBounds().overlaps(tileBounds); 100 | 101 | return currentZoom && currentBounds; 102 | 103 | }, 104 | 105 | _getVectorTilePromise: function(coords, tileBounds) { 106 | var data = { 107 | s: this._getSubdomain(coords), 108 | x: coords.x, 109 | y: coords.y, 110 | z: coords.z 111 | // z: this._getZoomForUrl() /// TODO: Maybe replicate TileLayer's maxNativeZoom 112 | }; 113 | if (this._map && !this._map.options.crs.infinite) { 114 | var invertedY = this._globalTileRange.max.y - coords.y; 115 | if (this.options.tms) { // Should this option be available in Leaflet.VectorGrid? 116 | data['y'] = invertedY; 117 | } 118 | data['-y'] = invertedY; 119 | } 120 | 121 | if (!this._isCurrentTile(coords, tileBounds)) { 122 | return Promise.resolve({layers:[]}); 123 | } 124 | 125 | var tileUrl = L.Util.template(this._url, L.extend(data, this.options)); 126 | 127 | return fetch(tileUrl, this.options.fetchOptions).then(function(response){ 128 | 129 | if (!response.ok || !this._isCurrentTile(coords)) { 130 | return {layers:[]}; 131 | } 132 | 133 | return response.blob().then( function (blob) { 134 | 135 | var reader = new FileReader(); 136 | return new Promise(function(resolve){ 137 | reader.addEventListener("loadend", function() { 138 | // reader.result contains the contents of blob as a typed array 139 | // blob.type === 'application/x-protobuf' 140 | var pbf = new Pbf( reader.result ); 141 | return resolve(new VectorTile( pbf )); 142 | 143 | }); 144 | reader.readAsArrayBuffer(blob); 145 | }); 146 | }); 147 | 148 | }.bind(this)).then(function(json){ 149 | 150 | // Normalize feature getters into actual instanced features 151 | for (var layerName in json.layers) { 152 | var feats = []; 153 | 154 | for (var i=0; i