diff --git a/css/L.Control.Locate.min.css b/css/L.Control.Locate.min.css new file mode 100644 index 0000000..8e6c43d --- /dev/null +++ b/css/L.Control.Locate.min.css @@ -0,0 +1,2 @@ +.leaflet-control-locate a{font-size:1.4em;color:#444}.leaflet-control-locate.active a{color:#2074B6}.leaflet-control-locate.active.following a{color:#FC8428} +/*# sourceMappingURL=L.Control.Locate.min.css.map */ diff --git a/css/MarkerCluster.Default.css b/css/MarkerCluster.Default.css new file mode 100644 index 0000000..bbc8c9f --- /dev/null +++ b/css/MarkerCluster.Default.css @@ -0,0 +1,60 @@ +.marker-cluster-small { + background-color: rgba(181, 226, 140, 0.6); + } +.marker-cluster-small div { + background-color: rgba(110, 204, 57, 0.6); + } + +.marker-cluster-medium { + background-color: rgba(241, 211, 87, 0.6); + } +.marker-cluster-medium div { + background-color: rgba(240, 194, 12, 0.6); + } + +.marker-cluster-large { + background-color: rgba(253, 156, 115, 0.6); + } +.marker-cluster-large div { + background-color: rgba(241, 128, 23, 0.6); + } + + /* IE 6-8 fallback colors */ +.leaflet-oldie .marker-cluster-small { + background-color: rgb(181, 226, 140); + } +.leaflet-oldie .marker-cluster-small div { + background-color: rgb(110, 204, 57); + } + +.leaflet-oldie .marker-cluster-medium { + background-color: rgb(241, 211, 87); + } +.leaflet-oldie .marker-cluster-medium div { + background-color: rgb(240, 194, 12); + } + +.leaflet-oldie .marker-cluster-large { + background-color: rgb(253, 156, 115); + } +.leaflet-oldie .marker-cluster-large div { + background-color: rgb(241, 128, 23); +} + +.marker-cluster { + background-clip: padding-box; + border-radius: 20px; + } +.marker-cluster div { + width: 30px; + height: 30px; + margin-left: 5px; + margin-top: 5px; + + text-align: center; + border-radius: 15px; + font: 12px "Helvetica Neue", Arial, Helvetica, sans-serif; + } +.marker-cluster span { + line-height: 30px; + } \ No newline at end of file diff --git a/css/MarkerCluster.css b/css/MarkerCluster.css new file mode 100644 index 0000000..c60d71b --- /dev/null +++ b/css/MarkerCluster.css @@ -0,0 +1,14 @@ +.leaflet-cluster-anim .leaflet-marker-icon, .leaflet-cluster-anim .leaflet-marker-shadow { + -webkit-transition: -webkit-transform 0.3s ease-out, opacity 0.3s ease-in; + -moz-transition: -moz-transform 0.3s ease-out, opacity 0.3s ease-in; + -o-transition: -o-transform 0.3s ease-out, opacity 0.3s ease-in; + transition: transform 0.3s ease-out, opacity 0.3s ease-in; +} + +.leaflet-cluster-spider-leg { + /* stroke-dashoffset (duration and function) should match with leaflet-marker-icon transform in order to track it exactly */ + -webkit-transition: -webkit-stroke-dashoffset 0.3s ease-out, -webkit-stroke-opacity 0.3s ease-in; + -moz-transition: -moz-stroke-dashoffset 0.3s ease-out, -moz-stroke-opacity 0.3s ease-in; + -o-transition: -o-stroke-dashoffset 0.3s ease-out, -o-stroke-opacity 0.3s ease-in; + transition: stroke-dashoffset 0.3s ease-out, stroke-opacity 0.3s ease-in; +} diff --git a/css/fontawesome-all.min.css b/css/fontawesome-all.min.css new file mode 100644 index 0000000..8539c00 --- /dev/null +++ b/css/fontawesome-all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-book-open:before{content:"\f518"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-memory:before{content:"\f538"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toolbox:before{content:"\f552"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/css/images/cancel.png b/css/images/cancel.png new file mode 100644 index 0000000..a4e7c49 Binary files /dev/null and b/css/images/cancel.png differ diff --git a/css/images/cancel_@2X.png b/css/images/cancel_@2X.png new file mode 100644 index 0000000..dcc72f0 Binary files /dev/null and b/css/images/cancel_@2X.png differ diff --git a/css/images/check.png b/css/images/check.png new file mode 100644 index 0000000..55f274b Binary files /dev/null and b/css/images/check.png differ diff --git a/css/images/check_@2X.png b/css/images/check_@2X.png new file mode 100644 index 0000000..df8032e Binary files /dev/null and b/css/images/check_@2X.png differ diff --git a/css/images/focus.png b/css/images/focus.png new file mode 100644 index 0000000..5a87d24 Binary files /dev/null and b/css/images/focus.png differ diff --git a/css/images/focus_@2X.png b/css/images/focus_@2X.png new file mode 100644 index 0000000..1eb7dd4 Binary files /dev/null and b/css/images/focus_@2X.png differ diff --git a/css/images/layers-2x.png b/css/images/layers-2x.png new file mode 100644 index 0000000..a2cf7f9 Binary files /dev/null and b/css/images/layers-2x.png differ diff --git a/css/images/layers.png b/css/images/layers.png new file mode 100644 index 0000000..bca0a0e Binary files /dev/null and b/css/images/layers.png differ diff --git a/css/images/marker-icon-2x.png b/css/images/marker-icon-2x.png new file mode 100644 index 0000000..0015b64 Binary files /dev/null and b/css/images/marker-icon-2x.png differ diff --git a/css/images/marker-icon.png b/css/images/marker-icon.png new file mode 100644 index 0000000..e2e9f75 Binary files /dev/null and b/css/images/marker-icon.png differ diff --git a/css/images/marker-shadow.png b/css/images/marker-shadow.png new file mode 100644 index 0000000..d1e773c Binary files /dev/null and b/css/images/marker-shadow.png differ diff --git a/css/images/measure-control.png b/css/images/measure-control.png new file mode 100644 index 0000000..b88e8e4 Binary files /dev/null and b/css/images/measure-control.png differ diff --git a/css/images/rulers.png b/css/images/rulers.png new file mode 100644 index 0000000..b88e8e4 Binary files /dev/null and b/css/images/rulers.png differ diff --git a/css/images/rulers_@2X.png b/css/images/rulers_@2X.png new file mode 100644 index 0000000..7247a0c Binary files /dev/null and b/css/images/rulers_@2X.png differ diff --git a/css/images/start.png b/css/images/start.png new file mode 100644 index 0000000..b8ca942 Binary files /dev/null and b/css/images/start.png differ diff --git a/css/images/start_@2X.png b/css/images/start_@2X.png new file mode 100644 index 0000000..01da494 Binary files /dev/null and b/css/images/start_@2X.png differ diff --git a/css/images/throbber.gif b/css/images/throbber.gif new file mode 100644 index 0000000..c0c52a0 Binary files /dev/null and b/css/images/throbber.gif differ diff --git a/css/images/trash.png b/css/images/trash.png new file mode 100644 index 0000000..7ff478a Binary files /dev/null and b/css/images/trash.png differ diff --git a/css/images/trash_@2X.png b/css/images/trash_@2X.png new file mode 100644 index 0000000..fea11a8 Binary files /dev/null and b/css/images/trash_@2X.png differ diff --git a/css/leaflet-control-geocoder.Geocoder.css b/css/leaflet-control-geocoder.Geocoder.css new file mode 100644 index 0000000..badbd30 --- /dev/null +++ b/css/leaflet-control-geocoder.Geocoder.css @@ -0,0 +1,123 @@ +.leaflet-control-geocoder { + border-radius: 4px; + background: white; + min-width: 26px; + min-height: 26px; +} + +.leaflet-touch .leaflet-control-geocoder { + min-width: 30px; + min-height: 30px; +} + +.leaflet-control-geocoder a, .leaflet-control-geocoder .leaflet-control-geocoder-icon { + border-bottom: none; + display: inline-block; +} + +.leaflet-control-geocoder .leaflet-control-geocoder-alternatives a { + width: inherit; + height: inherit; + line-height: inherit; +} + +.leaflet-control-geocoder a:hover, .leaflet-control-geocoder .leaflet-control-geocoder-icon:hover { + border-bottom: none; + display: inline-block; +} + +.leaflet-control-geocoder-form { + display: none; + vertical-align: middle; +} +.leaflet-control-geocoder-expanded .leaflet-control-geocoder-form { + display: inline-block; +} +.leaflet-control-geocoder-form input { + font-size: 120%; + border: 0; + background-color: transparent; + width: 246px; +} + +.leaflet-control-geocoder-icon { + border-radius: 4px; + width: 26px; + height: 26px; + border: none; + background-color: white; + //background-image: url(images/geocoder.png); + background-repeat: no-repeat; + background-position: center; + cursor: pointer; +} + +.leaflet-touch .leaflet-control-geocoder-icon { + width: 30px; + height: 30px; +} + +.leaflet-control-geocoder-throbber .leaflet-control-geocoder-icon { + background-image: url(images/throbber.gif); +} + +.leaflet-control-geocoder-form-no-error { + display: none; +} + +.leaflet-control-geocoder-form input:focus { + outline: none; +} + +.leaflet-control-geocoder-form button { + display: none; +} +.leaflet-control-geocoder-error { + margin-top: 8px; + margin-left: 8px; + display: block; + color: #444; +} +.leaflet-control-geocoder-alternatives { + display: block; + width: 272px; + list-style: none; + padding: 0; + margin: 0; +} + +.leaflet-control-geocoder-alternatives-minimized { + display: none; + height: 0; +} +.leaflet-control-geocoder-alternatives li { + white-space: nowrap; + display: block; + overflow: hidden; + padding: 5px 8px; + text-overflow: ellipsis; + border-bottom: 1px solid #ccc; + cursor: pointer; +} + +.leaflet-control-geocoder-alternatives li a, .leaflet-control-geocoder-alternatives li a:hover { + width: inherit; + height: inherit; + line-height: inherit; + background: inherit; + border-radius: inherit; + text-align: left; +} + +.leaflet-control-geocoder-alternatives li:last-child { + border-bottom: none; +} +.leaflet-control-geocoder-alternatives li:hover, .leaflet-control-geocoder-selected { + background-color: #f5f5f5; +} +.leaflet-control-geocoder-address-detail { + +} +.leaflet-control-geocoder-address-context { + color: #666; +} \ No newline at end of file diff --git a/css/leaflet-search.css b/css/leaflet-search.css new file mode 100644 index 0000000..b1e9f4a --- /dev/null +++ b/css/leaflet-search.css @@ -0,0 +1,18 @@ +/* + * Leaflet Control Search v2.7.0 - 2016-09-13 + * + * Copyright 2016 Stefano Cudini + * stefano.cudini@gmail.com + * http://labs.easyblog.it/ + * + * Licensed under the MIT license. + * + * Demo: + * http://labs.easyblog.it/maps/leaflet-search/ + * + * Source: + * git@github.com:stefanocudini/leaflet-search.git + * + */ + +.leaflet-container .leaflet-control-search{position:relative;float:left;background:#fff;color:#1978cf;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;background-color:rgba(255,255,255,.8);z-index:1000;box-shadow:0 1px 7px rgba(0,0,0,.65);margin-left:10px;margin-top:10px}.leaflet-control-search.search-exp{box-shadow:0 1px 7px #999;background:#fff}.leaflet-control-search .search-input{display:block;float:left;background:#fff;border:1px solid #666;border-radius:2px;height:18px;padding:0 18px 0 2px;margin:3px 0 3px 3px}.leaflet-control-search.search-load .search-input{background:url(../images/loader.gif) no-repeat center right #fff}.leaflet-control-search.search-load .search-cancel{visibility:hidden}.leaflet-control-search .search-cancel{display:block;width:22px;height:18px;position:absolute;right:22px;margin:3px 0;//background:url(../images/search-icon.png) no-repeat 0 -46px;text-decoration:none;filter:alpha(opacity=80);opacity:.8}.leaflet-control-search .search-cancel:hover{filter:alpha(opacity=100);opacity:1}.leaflet-control-search .search-cancel span{display:none;font-size:18px;line-height:20px;color:#ccc;font-weight:700}.leaflet-control-search .search-cancel:hover span{color:#aaa}.leaflet-control-search .search-button{display:block;float:left;width:26px;height:26px;//background:url(../images/search-icon.png) no-repeat 2px 2px #fff;border-radius:4px}.leaflet-control-search .search-button:hover{//background:url(../images/search-icon.png) no-repeat 2px -22px #fafafa}.leaflet-control-search .search-tooltip{position:absolute;top:100%;left:0;float:left;list-style:none;padding-left:0;min-width:120px;max-height:122px;box-shadow:1px 1px 6px rgba(0,0,0,.4);background-color:rgba(0,0,0,.25);z-index:1010;overflow-y:auto;overflow-x:hidden;cursor:pointer}.leaflet-control-search .search-tip{margin:2px;padding:2px 4px;display:block;color:#000;background:#eee;border-radius:.25em;text-decoration:none;white-space:nowrap;vertical-align:center}.leaflet-control-search .search-button:hover{background-color:#f4f4f4}.leaflet-control-search .search-tip-select,.leaflet-control-search .search-tip:hover{background-color:#fff}.leaflet-control-search .search-alert{cursor:pointer;clear:both;font-size:.75em;margin-bottom:5px;padding:0 .25em;color:#e00;font-weight:700;border-radius:.25em} \ No newline at end of file diff --git a/css/leaflet.css b/css/leaflet.css new file mode 100644 index 0000000..609a662 --- /dev/null +++ b/css/leaflet.css @@ -0,0 +1,640 @@ +/* required styles */ + +.leaflet-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-container, +.leaflet-pane > svg, +.leaflet-pane > canvas, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; + } +.leaflet-container { + overflow: hidden; + } +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; + } +/* Prevents IE11 from highlighting tiles in blue */ +.leaflet-tile::selection { + background: transparent; +} +/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ +.leaflet-safari .leaflet-tile { + image-rendering: -webkit-optimize-contrast; + } +/* hack that prevents hw layers "stretching" when loading new tiles */ +.leaflet-safari .leaflet-tile-container { + width: 1600px; + height: 1600px; + -webkit-transform-origin: 0 0; + } +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; + } +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container .leaflet-overlay-pane svg, +.leaflet-container .leaflet-marker-pane img, +.leaflet-container .leaflet-shadow-pane img, +.leaflet-container .leaflet-tile-pane img, +.leaflet-container img.leaflet-image-layer, +.leaflet-container .leaflet-tile { + max-width: none !important; + max-height: none !important; + } + +.leaflet-container.leaflet-touch-zoom { + -ms-touch-action: pan-x pan-y; + touch-action: pan-x pan-y; + } +.leaflet-container.leaflet-touch-drag { + -ms-touch-action: pinch-zoom; + /* Fallback for FF which doesn't support pinch-zoom */ + touch-action: none; + touch-action: pinch-zoom; +} +.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { + -ms-touch-action: none; + touch-action: none; +} +.leaflet-container { + -webkit-tap-highlight-color: transparent; +} +.leaflet-container a { + -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4); +} +.leaflet-tile { + filter: inherit; + visibility: hidden; + } +.leaflet-tile-loaded { + visibility: inherit; + } +.leaflet-zoom-box { + width: 0; + height: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 800; + } +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; + } + +.leaflet-pane { z-index: 400; } + +.leaflet-tile-pane { z-index: 200; } +.leaflet-overlay-pane { z-index: 400; } +.leaflet-shadow-pane { z-index: 500; } +.leaflet-marker-pane { z-index: 600; } +.leaflet-tooltip-pane { z-index: 650; } +.leaflet-popup-pane { z-index: 700; } + +.leaflet-map-pane canvas { z-index: 100; } +.leaflet-map-pane svg { z-index: 200; } + +.leaflet-vml-shape { + width: 1px; + height: 1px; + } +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; + } + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.leaflet-top { + top: 0; + } +.leaflet-right { + right: 0; + } +.leaflet-bottom { + bottom: 0; + } +.leaflet-left { + left: 0; + } +.leaflet-control { + float: left; + clear: both; + } +.leaflet-right .leaflet-control { + float: right; + } +.leaflet-top .leaflet-control { + margin-top: 10px; + } +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; + } +.leaflet-left .leaflet-control { + margin-left: 10px; + } +.leaflet-right .leaflet-control { + margin-right: 10px; + } + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-tile { + will-change: opacity; + } +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + } +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; + } +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + will-change: transform; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); + transition: transform 0.25s cubic-bezier(0,0,0.25,1); + } +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile { + -webkit-transition: none; + -moz-transition: none; + transition: none; + } + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; + } + + +/* cursors */ + +.leaflet-interactive { + cursor: pointer; + } +.leaflet-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; + } +.leaflet-crosshair, +.leaflet-crosshair .leaflet-interactive { + cursor: crosshair; + } +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; + } +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; + } + +/* marker & overlays interactivity */ +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-image-layer, +.leaflet-pane > svg path, +.leaflet-tile-container { + pointer-events: none; + } + +.leaflet-marker-icon.leaflet-interactive, +.leaflet-image-layer.leaflet-interactive, +.leaflet-pane > svg path.leaflet-interactive, +svg.leaflet-image-layer.leaflet-interactive path { + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline: 0; + } +.leaflet-container a { + color: #0078A8; + } +.leaflet-container a.leaflet-active { + outline: 2px solid orange; + } +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255,255,255,0.5); + } + + +/* general typography */ +.leaflet-container { + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; + } + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.leaflet-bar a, +.leaflet-bar a:hover { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; + } +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-bar a:hover { + background-color: #f4f4f4; + } +.leaflet-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } +.leaflet-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; + } +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } + +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + line-height: 30px; + } +.leaflet-touch .leaflet-bar a:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; + } +.leaflet-touch .leaflet-bar a:last-child { + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + } + +/* zoom control */ + +.leaflet-control-zoom-in, +.leaflet-control-zoom-out { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; + } + +.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out { + font-size: 22px; + } + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 5px rgba(0,0,0,0.4); + background: #fff; + border-radius: 5px; + } +.leaflet-control-layers-toggle { + background-image: url(images/layers.png); + width: 36px; + height: 36px; + } +.leaflet-retina .leaflet-control-layers-toggle { + background-image: url(images/layers-2x.png); + background-size: 26px 26px; + } +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; + } +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; + } +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; + } +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.leaflet-control-layers-scrollbar { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 5px; + } +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.leaflet-control-layers label { + display: block; + } +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + +/* Default icon URLs */ +.leaflet-default-icon-path { + background-image: url(images/marker-icon.png); + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.7); + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + } +.leaflet-control-attribution a { + text-decoration: none; + } +.leaflet-control-attribution a:hover { + text-decoration: underline; + } +.leaflet-container .leaflet-control-attribution, +.leaflet-container .leaflet-control-scale { + font-size: 11px; + } +.leaflet-left .leaflet-control-scale { + margin-left: 5px; + } +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; + } +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + font-size: 11px; + white-space: nowrap; + overflow: hidden; + -moz-box-sizing: border-box; + box-sizing: border-box; + + background: #fff; + background: rgba(255, 255, 255, 0.5); + } +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + } +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + box-shadow: none; + } +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + border: 2px solid rgba(0,0,0,0.2); + background-clip: padding-box; + } + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + margin-bottom: 20px; + } +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + border-radius: 12px; + } +.leaflet-popup-content { + margin: 13px 19px; + line-height: 1.4; + } +.leaflet-popup-content p { + margin: 18px 0; + } +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-left: -20px; + overflow: hidden; + pointer-events: none; + } +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } +.leaflet-popup-content-wrapper, +.leaflet-popup-tip { + background: white; + color: #333; + box-shadow: 0 3px 14px rgba(0,0,0,0.4); + } +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + padding: 4px 4px 0 0; + border: none; + text-align: center; + width: 18px; + height: 14px; + font: 16px/14px Tahoma, Verdana, sans-serif; + color: #c3c3c3; + text-decoration: none; + font-weight: bold; + background: transparent; + } +.leaflet-container a.leaflet-popup-close-button:hover { + color: #999; + } +.leaflet-popup-scrolled { + overflow: auto; + border-bottom: 1px solid #ddd; + border-top: 1px solid #ddd; + } + +.leaflet-oldie .leaflet-popup-content-wrapper { + zoom: 1; + } +.leaflet-oldie .leaflet-popup-tip { + width: 24px; + margin: 0 auto; + + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); + } +.leaflet-oldie .leaflet-popup-tip-container { + margin-top: -1px; + } + +.leaflet-oldie .leaflet-control-zoom, +.leaflet-oldie .leaflet-control-layers, +.leaflet-oldie .leaflet-popup-content-wrapper, +.leaflet-oldie .leaflet-popup-tip { + border: 1px solid #999; + } + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; + } + + +/* Tooltip */ +/* Base styles for the element that has a tooltip */ +.leaflet-tooltip { + position: absolute; + padding: 6px; + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + color: #222; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0,0,0,0.4); + } +.leaflet-tooltip.leaflet-clickable { + cursor: pointer; + pointer-events: auto; + } +.leaflet-tooltip-top:before, +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + position: absolute; + pointer-events: none; + border: 6px solid transparent; + background: transparent; + content: ""; + } + +/* Directions */ + +.leaflet-tooltip-bottom { + margin-top: 6px; +} +.leaflet-tooltip-top { + margin-top: -6px; +} +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-top:before { + left: 50%; + margin-left: -6px; + } +.leaflet-tooltip-top:before { + bottom: 0; + margin-bottom: -12px; + border-top-color: #fff; + } +.leaflet-tooltip-bottom:before { + top: 0; + margin-top: -12px; + margin-left: -6px; + border-bottom-color: #fff; + } +.leaflet-tooltip-left { + margin-left: -6px; +} +.leaflet-tooltip-right { + margin-left: 6px; +} +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + top: 50%; + margin-top: -6px; + } +.leaflet-tooltip-left:before { + right: 0; + margin-right: -12px; + border-left-color: #fff; + } +.leaflet-tooltip-right:before { + left: 0; + margin-left: -12px; + border-right-color: #fff; + } diff --git a/css/qgis2web.css b/css/qgis2web.css new file mode 100644 index 0000000..9bb0a02 --- /dev/null +++ b/css/qgis2web.css @@ -0,0 +1,129 @@ + + #map { + background-color: #ffffff + } + th { + text-align: left; + vertical-align: top; + } + .info { + padding: 6px 8px; + font: 14px/16px Arial, Helvetica, sans-serif; + background: white; + background: rgba(255,255,255,0.8); + box-shadow: 0 0 15px rgba(0,0,0,0.2); + border-radius: 5px; + } + .info h2 { + margin: 0 0 5px; + color: #777; + } + .leaflet-container { + background: #fff; + padding-right: 10px; + } + .leaflet-popup-content { + width:auto; + padding-right:10px; + } + .leaflet-tooltip { + background: none; + box-shadow: none; + border: none; + } + .leaflet-tooltip-left:before, .leaflet-tooltip-right:before { + border: 0px; + } + } + .fa, .leaflet-container, a { + color: #000000 !important; + } + .leaflet-control-zoom-in, .leaflet-control-zoom-out, + .leaflet-control-locate a, + .leaflet-touch .leaflet-control-geocoder-icon, + .leaflet-control-search .search-button, + .leaflet-control-measure { + background-color: #f8f8f8 !important; + border-radius: 0px !important; + color: #000000 !important; + } + .abstract { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; + background-color: #f8f8f8 !important; + width: 30px !important; + color: #000000 !important; + height: 30px !important; + text-align: center !important; + line-height: 30px !important; + } + .abstractUncollapsed { + padding: 6px 8px; + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; + background-color:#f8f8f8 !important; + color: #000000 !important; + box-shadow: 0 0 15px rgba(0,0,0,0.2); + border-radius: 5px; + max-width: 40%; + } + .leaflet-touch .leaflet-control-layers, + .leaflet-touch .leaflet-bar, + .leaflet-control-search, + .leaflet-control-measure { + border: 3px solid rgba(255,255,255,.4) !important; + } + .leaflet-control-attribution a { + color: #0078A8 !important; + } + .leaflet-control-scale-line { + border: 2px solid #f8f8f8 !important; + border-top: none !important; + color: black !important; + } + .leaflet-control-search .search-button, + .leaflet-container .leaflet-control-search, + .leaflet-control-measure { + box-shadow: none !important; + } + .leaflet-control-search .search-button { + width: 30px !important; + height: 30px !important; + font-size: 13px !important; + text-align: center !important; + line-height: 30px !important; + } + .leaflet-control-measure .leaflet-control { + width: 30px !important; + height: 30px !important; + } + .leaflet-container .leaflet-control-search{ + background: none !important; + } + .leaflet-control-search .search-input { + margin: 0px 0px 0px 0px !important; + height: 30px !important; + } + .leaflet-control-measure { + background: none!important; + border-radius: 4px !important; + } + .leaflet-control-measure .leaflet-control-measure-interaction { + background-color: #f8f8f8 !important; + } + .leaflet-touch .leaflet-control-measure + .leaflet-control-measure-toggle, + .leaflet-touch .leaflet-control-measure + .leaflet-control-measure-toggle:hover { + width: 30px !important; + height: 30px !important; + border-radius: 0px !important; + background-color: #f8f8f8 !important; + color: #000000 !important; + font-size: 13px; + line-height: 30px; + text-align: center; + text-indent: 0%; + } + .leaflet-control-layers-toggle { + background-color: #f8f8f8 !important; + } \ No newline at end of file diff --git a/data/ne_10m_airports_1.js b/data/ne_10m_airports_1.js new file mode 100644 index 0000000..99ba7bc --- /dev/null +++ b/data/ne_10m_airports_1.js @@ -0,0 +1 @@ +var json_ne_10m_airports_1 = {"type":"FeatureCollection","name":"ne_10m_airports_1","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properties":{"type":"small","name":"Sahnewal","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sahnewal_Airport","comments":null,"name_en":"Sahnewal Airport"},"geometry":{"type":"Point","coordinates":[75.957072240365179,30.850359856170176]}},{"type":"Feature","properties":{"type":"mid","name":"Solapur","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Solapur_Airport","comments":null,"name_en":"Solapur Airport"},"geometry":{"type":"Point","coordinates":[75.933059771075492,17.625415183635024]}},{"type":"Feature","properties":{"type":"mid","name":"Birsa Munda","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Birsa_Munda_Airport","comments":null,"name_en":"Birsa Munda Airport"},"geometry":{"type":"Point","coordinates":[85.323597036876706,23.317724598996193]}},{"type":"Feature","properties":{"type":"mid","name":"Ahwaz","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ahwaz_Airport","comments":null,"name_en":"Ahvaz International Airport"},"geometry":{"type":"Point","coordinates":[48.747106543593127,31.343158556075725]}},{"type":"Feature","properties":{"type":"mid and military","name":"Gwalior","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gwalior_Airport","comments":null,"name_en":"Gwalior Airport"},"geometry":{"type":"Point","coordinates":[78.217218654634834,26.285487697937011]}},{"type":"Feature","properties":{"type":"mid","name":"Hodeidah Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hodeida_International_Airport","comments":null,"name_en":"Hodeida International Airport"},"geometry":{"type":"Point","coordinates":[42.97109630194003,14.755253441372462]}},{"type":"Feature","properties":{"type":"mid","name":"Devi Ahilyabai Holkar Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Devi_Ahilyabai_Holkar_International_Airport","comments":null,"name_en":"Devi Ahilyabai Holkar Airport"},"geometry":{"type":"Point","coordinates":[75.809291500589495,22.72774918757095]}},{"type":"Feature","properties":{"type":"mid","name":"Gandhinagar","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Gandhinagar_Airport","comments":null,"name_en":"Gandhinagar Airport"},"geometry":{"type":"Point","coordinates":[73.810567492468863,19.966020567280626]}},{"type":"Feature","properties":{"type":"major and military","name":"Chandigarh Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chandigarh_Airport","comments":null,"name_en":"Chandigarh Airport"},"geometry":{"type":"Point","coordinates":[76.801726110524172,30.670724894966725]}},{"type":"Feature","properties":{"type":"mid","name":"Aurangabad","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Aurangabad_Airport","comments":null,"name_en":"Aurangabad Airport"},"geometry":{"type":"Point","coordinates":[75.39584329220051,19.867296962108234]}},{"type":"Feature","properties":{"type":"mid and military","name":"Faisalabad Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Faisalabad_International_Airport","comments":null,"name_en":"Faisalabad International Airport"},"geometry":{"type":"Point","coordinates":[72.987819092230495,31.362743548086222]}},{"type":"Feature","properties":{"type":"mid","name":"Omsk Tsentralny","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Omsk_Tsentralny_Airport","comments":null,"name_en":"Omsk Tsentralny Airport"},"geometry":{"type":"Point","coordinates":[73.316359537658499,54.957648293405938]}},{"type":"Feature","properties":{"type":"mid","name":"Novosibirsk Tolmachev","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tolmachevo_Airport","comments":null,"name_en":"Tolmachevo Airport"},"geometry":{"type":"Point","coordinates":[82.667152452586521,55.00958471362636]}},{"type":"Feature","properties":{"type":"mid and military","name":"Zaporozhye Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Zaporizhia_International_Airport","comments":null,"name_en":"Zaporizhzhia International Airport"},"geometry":{"type":"Point","coordinates":[35.301872857527862,47.873263557902284]}},{"type":"Feature","properties":{"type":"mid","name":"Simpang Tiga","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sultan_Syarif_Qasim_II_International_Airport","comments":null,"name_en":"Sultan Syarif Kasim II Airport"},"geometry":{"type":"Point","coordinates":[101.446569298440863,0.464600872998505]}},{"type":"Feature","properties":{"type":"mid","name":"Rota Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Rota_International_Airport","comments":null,"name_en":"Rota International Airport"},"geometry":{"type":"Point","coordinates":[145.243980298581846,14.171771297121616]}},{"type":"Feature","properties":{"type":"mid","name":"Surgut","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Surgut_Airport","comments":null,"name_en":"Surgut International Airport"},"geometry":{"type":"Point","coordinates":[73.408496476437477,61.340167219448126]}},{"type":"Feature","properties":{"type":"mid","name":"Tiruchirappalli","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tiruchirappalli_Airport","comments":null,"name_en":"Tiruchirapalli Airport"},"geometry":{"type":"Point","coordinates":[78.708957874747597,10.76035713065535]}},{"type":"Feature","properties":{"type":"mid","name":"Turbat Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Turbat_International_Airport","comments":null,"name_en":"Turbat International Airport"},"geometry":{"type":"Point","coordinates":[63.027933351918136,25.988794590011004]}},{"type":"Feature","properties":{"type":"mid","name":"Quetta Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Quetta_International_Airport","comments":null,"name_en":"Quetta International Airport"},"geometry":{"type":"Point","coordinates":[66.948731148094936,30.249043186181034]}},{"type":"Feature","properties":{"type":"mid","name":"Zahedan Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Zahedan_International_Airport","comments":null,"name_en":"Zahedan Airport"},"geometry":{"type":"Point","coordinates":[60.90070856491495,29.475294195657344]}},{"type":"Feature","properties":{"type":"mid and military","name":"Abdul Rachman Saleh","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Abdul_Rachman_Saleh_Airport","comments":null,"name_en":"Abdul Rachman Saleh Airport"},"geometry":{"type":"Point","coordinates":[112.711418617257749,-7.929980028405668]}},{"type":"Feature","properties":{"type":"mid","name":"Barnaul","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Barnaul_Airport","comments":null,"name_en":"Barnaul Airport"},"geometry":{"type":"Point","coordinates":[83.550453212403767,53.3633850813046]}},{"type":"Feature","properties":{"type":"military mid","name":"Adampur","location":"runway","wikipedia":null,"comments":"ok (military)","name_en":"Adampur Air force base"},"geometry":{"type":"Point","coordinates":[75.758482845600454,31.432942239771489]}},{"type":"Feature","properties":{"type":"military","name":"Bareilly","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Bareilly_Airport","comments":null,"name_en":"Bareilly Airport"},"geometry":{"type":"Point","coordinates":[79.452002687657043,28.421808716114356]}},{"type":"Feature","properties":{"type":"small","name":"Dhamial","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Dhamial_Army_Airbase","comments":null,"name_en":"Dhamial Army Airbase"},"geometry":{"type":"Point","coordinates":[73.032049839200226,33.561414627886052]}},{"type":"Feature","properties":{"type":"major","name":"Cheongju Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cheongju_International_Airport","comments":null,"name_en":"Cheongju International Airport"},"geometry":{"type":"Point","coordinates":[127.495916124680846,36.722022776667259]}},{"type":"Feature","properties":{"type":"mid and military","name":"Gwangju","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gwangju_Airport","comments":null,"name_en":"Gwangju Airport"},"geometry":{"type":"Point","coordinates":[126.810839481226438,35.14000513901977]}},{"type":"Feature","properties":{"type":"mid","name":"Daegu Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Daegu_Airport","comments":null,"name_en":"Daegu International Airport"},"geometry":{"type":"Point","coordinates":[128.637537699933119,35.899927796908663]}},{"type":"Feature","properties":{"type":"mid","name":"Ulsan","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ulsan_Airport","comments":null,"name_en":"Ulsan Airport"},"geometry":{"type":"Point","coordinates":[129.355731047528252,35.592895752710689]}},{"type":"Feature","properties":{"type":"mid","name":"Radin Inten II","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Radin_Inten_II_Airport","comments":null,"name_en":"Radin Inten II Airport"},"geometry":{"type":"Point","coordinates":[105.176060419161416,-5.242566777131995]}},{"type":"Feature","properties":{"type":"military","name":"Allahabad","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Allahabad_Airport","comments":null,"name_en":"Allahabad Airport"},"geometry":{"type":"Point","coordinates":[81.731727146218716,25.443522027820965]}},{"type":"Feature","properties":{"type":"mid","name":"Chelyabinsk","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chelyabinsk_Airport","comments":null,"name_en":"Chelyabinsk Airport"},"geometry":{"type":"Point","coordinates":[61.512258974020092,55.297791949605532]}},{"type":"Feature","properties":{"type":"military mid","name":"Tainan","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Tainan_Airport","comments":null,"name_en":"Tainan Airport"},"geometry":{"type":"Point","coordinates":[120.209733318093257,22.950667918346994]}},{"type":"Feature","properties":{"type":"military mid","name":"Taichung","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Taichung_Airport","comments":null,"name_en":"Taichung Airport"},"geometry":{"type":"Point","coordinates":[120.630703547583948,24.266655556711459]}},{"type":"Feature","properties":{"type":"mid","name":"Rotterdam The Hague","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Rotterdam_The_Hague_Airport","comments":null,"name_en":"Rotterdam The Hague Airport"},"geometry":{"type":"Point","coordinates":[4.433844349628765,51.949130189938153]}},{"type":"Feature","properties":{"type":"mid","name":"Voronezh-Chertovitskoye","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Voronezh_International_Airport","comments":null,"name_en":"Voronezh International Airport"},"geometry":{"type":"Point","coordinates":[39.225449644797337,51.812617126834411]}},{"type":"Feature","properties":{"type":"major","name":"Liverpool John Lennon","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Liverpool_John_Lennon_Airport","comments":null,"name_en":"Liverpool John Lennon Airport"},"geometry":{"type":"Point","coordinates":[-2.858620657849379,53.336375105442215]}},{"type":"Feature","properties":{"type":"mid","name":"Vishakapatnam","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Visakhapatnam_Airport","comments":null,"name_en":"Visakhapatnam International Airport"},"geometry":{"type":"Point","coordinates":[83.223521638746504,17.727957738436402]}},{"type":"Feature","properties":{"type":"major","name":"Sultan Hasanuddin Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sultan_Hasanuddin_International_Airport","comments":null,"name_en":"Sultan Hasanuddin International Airport"},"geometry":{"type":"Point","coordinates":[119.545691342150633,-5.058936894557788]}},{"type":"Feature","properties":{"type":"mid","name":"Vava'u Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Vava'u_International_Airport","comments":null,"name_en":"Vava'u International Airport"},"geometry":{"type":"Point","coordinates":[-173.968093944158767,-18.586005855065373]}},{"type":"Feature","properties":{"type":"major","name":"Newcastle Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Newcastle_Airport","comments":null,"name_en":"Newcastle International Airport"},"geometry":{"type":"Point","coordinates":[-1.71034578407216,55.037084860801954]}},{"type":"Feature","properties":{"type":"mid","name":"Goloson Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Golos%C3%B3n_International_Airport","comments":null,"name_en":"Golosón International Airport"},"geometry":{"type":"Point","coordinates":[-86.851468502001097,15.745159665912579]}},{"type":"Feature","properties":{"type":"major","name":"Madinah Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Prince_Mohammad_Bin_Abdulaziz_Airport","comments":null,"name_en":"Prince Mohammad Bin Abdulaziz International Airport"},"geometry":{"type":"Point","coordinates":[39.699135956041737,24.544233960566078]}},{"type":"Feature","properties":{"type":"mid","name":"Mirabel Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Montr%C3%A9al-Mirabel_International_Airport","comments":null,"name_en":"Montréal–Mirabel International Airport"},"geometry":{"type":"Point","coordinates":[-74.028738298481386,45.683225097926709]}},{"type":"Feature","properties":{"type":"mid","name":"Palanga Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Palanga_International_Airport","comments":null,"name_en":"Palanga International Airport"},"geometry":{"type":"Point","coordinates":[21.097446398625141,55.971342623535804]}},{"type":"Feature","properties":{"type":"mid","name":"Jaipur Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jaipur_International_Airport","comments":null,"name_en":"Jaipur International Airport"},"geometry":{"type":"Point","coordinates":[75.801010419266817,26.821179810060464]}},{"type":"Feature","properties":{"type":"mid","name":"Sonari","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sonari_Airport","comments":null,"name_en":"Sonari Airport"},"geometry":{"type":"Point","coordinates":[86.172466236377574,22.815414511024233]}},{"type":"Feature","properties":{"type":"mid","name":"Yenisehir","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Yeni%C5%9Fehir_Airport","comments":null,"name_en":"Yenişehir Airport"},"geometry":{"type":"Point","coordinates":[29.54492,40.255539500747304]}},{"type":"Feature","properties":{"type":"major","name":"Şakirpaşa","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Adana_%C5%9Eakirpa%C5%9Fa_Airport","comments":null,"name_en":"Adana Şakirpaşa Airport"},"geometry":{"type":"Point","coordinates":[35.296961426833811,36.9852090641795]}},{"type":"Feature","properties":{"type":"mid","name":"Kodiak","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Kodiak_Airport","comments":null,"name_en":"Kodiak Airport"},"geometry":{"type":"Point","coordinates":[-152.485638515234513,57.748592107048268]}},{"type":"Feature","properties":{"type":"major","name":"Amarillo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Rick_Husband_Amarillo_International_Airport","comments":null,"name_en":"Rick Husband Amarillo International Airport"},"geometry":{"type":"Point","coordinates":[-101.705352772696784,35.218403191939814]}},{"type":"Feature","properties":{"type":"mid","name":"Alice Springs","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Alice_Springs_Airport","comments":null,"name_en":"Alice Springs Airport"},"geometry":{"type":"Point","coordinates":[133.902918,-23.801968]}},{"type":"Feature","properties":{"type":"mid and military","name":"Raja Sansi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Raja_Sansi_International_Airport","comments":null,"name_en":"Sri Guru Ram Dass Jee International Airport"},"geometry":{"type":"Point","coordinates":[74.807155971982439,31.706822025888847]}},{"type":"Feature","properties":{"type":"mid","name":"Biju Patnaik","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Biju_Patnaik_Airport","comments":null,"name_en":"Biju Patnaik Airport"},"geometry":{"type":"Point","coordinates":[85.816889954442928,20.252665975473413]}},{"type":"Feature","properties":{"type":"mid","name":"Bethel","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Bethel_Airport","comments":null,"name_en":"Bethel Airport"},"geometry":{"type":"Point","coordinates":[-161.838986959439694,60.778737983408831]}},{"type":"Feature","properties":{"type":"mid","name":"Palonegro","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Palonegro_International_Airport","comments":null,"name_en":"Palonegro International Airport"},"geometry":{"type":"Point","coordinates":[-73.180920772536069,7.127709154026846]}},{"type":"Feature","properties":{"type":"major","name":"Birmingham Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Birmingham_International_Airport_(US)","comments":null,"name_en":"Birmingham-Shuttlesworth International Airport"},"geometry":{"type":"Point","coordinates":[-86.752377361546237,33.561867282805771]}},{"type":"Feature","properties":{"type":"mid","name":"Broken Hill","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Broken_Hill_Airport","comments":null,"name_en":"Broken Hill Airport"},"geometry":{"type":"Point","coordinates":[141.470407303097261,-31.998996737463017]}},{"type":"Feature","properties":{"type":"major","name":"Logan Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Billings_Logan_International_Airport","comments":null,"name_en":"Billings Logan International Airport"},"geometry":{"type":"Point","coordinates":[-108.536929388124619,45.803685571527836]}},{"type":"Feature","properties":{"type":"mid","name":"Bismarck Muni.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bismarck_Municipal_Airport","comments":null,"name_en":"Bismarck Municipal Airport"},"geometry":{"type":"Point","coordinates":[-100.757471303717452,46.775106666161378]}},{"type":"Feature","properties":{"type":"mid","name":"Del Bajio Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Del_Baj%C3%ADo_International_Airport","comments":null,"name_en":"Del Bajío International Airport"},"geometry":{"type":"Point","coordinates":[-101.478753382466877,20.985887121193809]}},{"type":"Feature","properties":{"type":"mid","name":"Benin","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Benin_Airport","comments":null,"name_en":"Benin Airport"},"geometry":{"type":"Point","coordinates":[5.603682560067003,6.317166892078184]}},{"type":"Feature","properties":{"type":"major","name":"Bourgas","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Burgas_Airport","comments":null,"name_en":"Burgas Airport"},"geometry":{"type":"Point","coordinates":[27.51640936629526,42.567083548770192]}},{"type":"Feature","properties":{"type":"major","name":"Bremen","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bremen_Airport","comments":null,"name_en":"Bremen Airport"},"geometry":{"type":"Point","coordinates":[8.7858617703132,53.052287104156015]}},{"type":"Feature","properties":{"type":"mid","name":"Jacinto Lara Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jacinto_Lara_International_Airport","comments":null,"name_en":"Jacinto Lara International Airport"},"geometry":{"type":"Point","coordinates":[-69.356102,10.0453]}},{"type":"Feature","properties":{"type":"mid","name":"Brownsville-South Padre Island Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Brownsville/South_Padre_Island_International_Airport","comments":null,"name_en":"Brownsville/South Padre Island International Airport"},"geometry":{"type":"Point","coordinates":[-97.431765340232019,25.906274354534673]}},{"type":"Feature","properties":{"type":"major","name":"Bristol Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bristol_International_Airport","comments":null,"name_en":"Bristol Airport"},"geometry":{"type":"Point","coordinates":[-2.710864691343084,51.386293418914839]}},{"type":"Feature","properties":{"type":"major","name":"Baton Rouge Metro","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Baton_Rouge_Metropolitan_Airport","comments":null,"name_en":"Baton Rouge Metropolitan Airport"},"geometry":{"type":"Point","coordinates":[-91.156754404810485,30.532613804058556]}},{"type":"Feature","properties":{"type":"major","name":"Bratislava-M.R. Štefánik","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/M._R._%C5%A0tef%C3%A1nik_Airport","comments":null,"name_en":"M. R. Štefánik Airport"},"geometry":{"type":"Point","coordinates":[17.199985002220789,48.169837906253491]}},{"type":"Feature","properties":{"type":"mid","name":"Burlington Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Burlington_International_Airport","comments":null,"name_en":"Burlington International Airport"},"geometry":{"type":"Point","coordinates":[-73.15507877906677,44.469206604073214]}},{"type":"Feature","properties":{"type":"major","name":"Columbia Metro","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Columbia_Metropolitan_Airport","comments":null,"name_en":"Columbia Metropolitan Airport"},"geometry":{"type":"Point","coordinates":[-81.109335242937718,33.934205458427535]}},{"type":"Feature","properties":{"type":"major","name":"Calicut Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Calicut_International_Airport","comments":null,"name_en":"Calicut International Airport"},"geometry":{"type":"Point","coordinates":[75.950993063051044,11.139552052606399]}},{"type":"Feature","properties":{"type":"mid","name":"Cocos (Keeling) Islands","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cocos_(Keeling)_Islands_Airport","comments":null,"name_en":"Cocos"},"geometry":{"type":"Point","coordinates":[96.82874721442073,-12.185158595329305]}},{"type":"Feature","properties":{"type":"mid","name":"Corfu Int'l (Ioannis Kapodistrias)","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Corfu_International_Airport","comments":null,"name_en":"Corfu International Airport"},"geometry":{"type":"Point","coordinates":[19.914756164166214,39.60675545052586]}},{"type":"Feature","properties":{"type":"major","name":"Changchun Longjia Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Changchun_Longjia_International_Airport","comments":null,"name_en":"Changchun Longjia International Airport"},"geometry":{"type":"Point","coordinates":[125.690456812998363,43.993011479576971]}},{"type":"Feature","properties":{"type":"major and military","name":"Charleston Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Charleston_International_Airport","comments":null,"name_en":"Charleston International Airport"},"geometry":{"type":"Point","coordinates":[-80.036933743826239,32.884530156296464]}},{"type":"Feature","properties":{"type":"mid","name":"Coimbatore","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Coimbatore_Airport","comments":null,"name_en":"Coimbatore Airport"},"geometry":{"type":"Point","coordinates":[77.038893772262043,11.030141512598268]}},{"type":"Feature","properties":{"type":"mid","name":"Someseni","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Cluj-Napoca_International_Airport","comments":null,"name_en":"Cluj International Airport"},"geometry":{"type":"Point","coordinates":[23.686981268048559,46.782662634024277]}},{"type":"Feature","properties":{"type":"mid","name":"Ignacio Agramonte","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ignacio_Agramonte_International_Airport","comments":null,"name_en":"Ignacio Agramonte International Airport"},"geometry":{"type":"Point","coordinates":[-77.845103993516659,21.424703728196057]}},{"type":"Feature","properties":{"type":"major","name":"Casper/Natrona County Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Casper/Natrona_County_International_Airport","comments":null,"name_en":"Casper–Natrona County International Airport"},"geometry":{"type":"Point","coordinates":[-106.464444809691784,42.897190048300573]}},{"type":"Feature","properties":{"type":"major","name":"Clark Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Clark_International_Airport","comments":null,"name_en":"Clark International Airport"},"geometry":{"type":"Point","coordinates":[120.550770223913972,15.187642242388833]}},{"type":"Feature","properties":{"type":"major and military","name":"Yeager","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Yeager_Airport","comments":null,"name_en":"Yeager Airport"},"geometry":{"type":"Point","coordinates":[-81.596416466752601,38.370591437286457]}},{"type":"Feature","properties":{"type":"major","name":"Catania Fontanarossa","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Catania-Fontanarossa_Airport","comments":null,"name_en":"Catania-Fontanarossa Airport"},"geometry":{"type":"Point","coordinates":[15.067460500705343,37.470072800341015]}},{"type":"Feature","properties":{"type":"mid","name":"Chetumal Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chetumal_International_Airport","comments":null,"name_en":"Chetumal International Airport"},"geometry":{"type":"Point","coordinates":[-88.324260041536505,18.506434233376005]}},{"type":"Feature","properties":{"type":"major","name":"Cardiff","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cardiff_Airport","comments":null,"name_en":"Cardiff Airport"},"geometry":{"type":"Point","coordinates":[-3.339568764291176,51.398622091101743]}},{"type":"Feature","properties":{"type":"mid","name":"Gerrard Smith","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gerrard_Smith_International_Airport","comments":null,"name_en":"Charles Kirkconnell International Airport"},"geometry":{"type":"Point","coordinates":[-79.879461638002965,19.68986539628435]}},{"type":"Feature","properties":{"type":"mid","name":"Cozumel Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cozumel_International_Airport","comments":null,"name_en":"Cozumel International Airport"},"geometry":{"type":"Point","coordinates":[-86.93040640704362,20.511554377164721]}},{"type":"Feature","properties":{"type":"major","name":"James M. Cox Dayton Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dayton_International_Airport","comments":null,"name_en":"Dayton International Airport"},"geometry":{"type":"Point","coordinates":[-84.22045942381024,39.899040286536199]}},{"type":"Feature","properties":{"type":"mid","name":"Dubbo","location":"approximate","wikipedia":"http://en.wikipedia.org/wiki/Dubbo_Airport","comments":null,"name_en":"Dubbo City Regional Airport"},"geometry":{"type":"Point","coordinates":[148.569717,-32.218681]}},{"type":"Feature","properties":{"type":"major","name":"Washington Nat'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ronald_Reagan_Washington_National_Airport","comments":null,"name_en":"Ronald Reagan Washington National Airport"},"geometry":{"type":"Point","coordinates":[-77.043337392563117,38.853716201212265]}},{"type":"Feature","properties":{"type":"mid","name":"Durango Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Guadalupe_Victoria_International_Airport","comments":null,"name_en":"General Guadalupe Victoria International Airport"},"geometry":{"type":"Point","coordinates":[-104.53384602496385,24.12619483261825]}},{"type":"Feature","properties":{"type":"mid","name":"Voloskoye","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dnipropetrovsk_International_Airport","comments":null,"name_en":"Dnipro International Airport"},"geometry":{"type":"Point","coordinates":[35.093906022497471,48.367571802111691]}},{"type":"Feature","properties":{"type":"major","name":"Donetsk","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Donetsk_International_Airport","comments":null,"name_en":"Donetsk International Airport"},"geometry":{"type":"Point","coordinates":[37.744808557210334,48.069167128558192]}},{"type":"Feature","properties":{"type":"mid","name":"Santa Bernardina Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Santa_Bernardina_International_Airport","comments":null,"name_en":"Santa Bernardina International Airport"},"geometry":{"type":"Point","coordinates":[-56.499263621374418,-33.359108447550071]}},{"type":"Feature","properties":{"type":"major","name":"Edinburgh Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Edinburgh_Airport","comments":null,"name_en":"Edinburgh Airport"},"geometry":{"type":"Point","coordinates":[-3.364284685135545,55.948554011363903]}},{"type":"Feature","properties":{"type":"mid","name":"Terrance B. Lettsome Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Terrance_B._Lettsome_International_Airport","comments":null,"name_en":"Terrance B. Lettsome International Airport"},"geometry":{"type":"Point","coordinates":[-64.53715143657945,18.444361855798306]}},{"type":"Feature","properties":{"type":"mid","name":"Elko Reg.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Elko_Regional_Airport","comments":null,"name_en":"Elko Regional Airport"},"geometry":{"type":"Point","coordinates":[-115.786479232249121,40.827605881522487]}},{"type":"Feature","properties":{"type":"mid","name":"Ensenada","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Ensenada_Airport","comments":null,"name_en":"Ensenada Airport"},"geometry":{"type":"Point","coordinates":[-116.595724400417822,31.797713976056865]}},{"type":"Feature","properties":{"type":"mid","name":"Vágar","location":"approximate","wikipedia":"http://en.wikipedia.org/wiki/V%C3%A1gar_Airport","comments":null,"name_en":"Vágar Airport"},"geometry":{"type":"Point","coordinates":[-7.2708,62.0625]}},{"type":"Feature","properties":{"type":"mid and military","name":"Hector Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hector_International_Airport","comments":null,"name_en":"Hector International Airport"},"geometry":{"type":"Point","coordinates":[-96.825456126967495,46.919817881132275]}},{"type":"Feature","properties":{"type":"mid","name":"Fresno Yosemite Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Fresno_Yosemite_International_Airport","comments":null,"name_en":"Fresno Yosemite International Airport"},"geometry":{"type":"Point","coordinates":[-119.720001323575815,36.769812837395939]}},{"type":"Feature","properties":{"type":"mid","name":"Flagstaff Pulliam","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Flagstaff_Pulliam_Airport","comments":null,"name_en":"Flagstaff Pulliam Airport"},"geometry":{"type":"Point","coordinates":[-111.674656171675096,35.138911675797587]}},{"type":"Feature","properties":{"type":"mid","name":"Mundo Maya Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mundo_Maya_International_Airport","comments":"ok","name_en":"Mundo Maya International Airport"},"geometry":{"type":"Point","coordinates":[-89.87784042265082,16.914974164222567]}},{"type":"Feature","properties":{"type":"mid","name":"Sioux Falls Reg.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sioux_Falls_Regional_Airport","comments":null,"name_en":"Sioux Falls Regional Airport"},"geometry":{"type":"Point","coordinates":[-96.731383101754076,43.580193497276319]}},{"type":"Feature","properties":{"type":"major","name":"Spokane Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Spokane_International_Airport","comments":null,"name_en":"Spokane International Airport"},"geometry":{"type":"Point","coordinates":[-117.536836628585164,47.625478127836779]}},{"type":"Feature","properties":{"type":"mid","name":"Exuma Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Exuma_International_Airport","comments":null,"name_en":"Exuma International Airport"},"geometry":{"type":"Point","coordinates":[-75.872613085303954,23.563882906925851]}},{"type":"Feature","properties":{"type":"mid","name":"Gibraltar","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Gibraltar_Airport","comments":null,"name_en":"Gibraltar International Airport"},"geometry":{"type":"Point","coordinates":[-5.346771800333878,36.151274750417343]}},{"type":"Feature","properties":{"type":"mid","name":"Gerald R. Ford Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gerald_R._Ford_International_Airport","comments":null,"name_en":"Gerald R. Ford International Airport"},"geometry":{"type":"Point","coordinates":[-85.529573207274012,42.884777602090793]}},{"type":"Feature","properties":{"type":"major","name":"Triad Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Piedmont_Triad_International_Airport","comments":null,"name_en":"Piedmont Triad International Airport"},"geometry":{"type":"Point","coordinates":[-79.936486757748355,36.105378199893245]}},{"type":"Feature","properties":{"type":"mid","name":"Great Falls Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Great_Falls_International_Airport","comments":null,"name_en":"Great Falls International Airport"},"geometry":{"type":"Point","coordinates":[-111.356684727840005,47.482270729263035]}},{"type":"Feature","properties":{"type":"major","name":"Gaziantep Oğuzeli Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/O%C4%9Fuzeli_Airport","comments":null,"name_en":"Oğuzeli Airport"},"geometry":{"type":"Point","coordinates":[37.473803252189995,36.945363344687536]}},{"type":"Feature","properties":{"type":"mid","name":"Hubli","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hubli_Airport","comments":"ok","name_en":"Hubli Airport"},"geometry":{"type":"Point","coordinates":[75.086315568028127,15.359183338622918]}},{"type":"Feature","properties":{"type":"mid","name":"Hat Yai Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hat_Yai_International_Airport","comments":null,"name_en":"Hat Yai International Airport"},"geometry":{"type":"Point","coordinates":[100.393751274671317,6.93634231940664]}},{"type":"Feature","properties":{"type":"mid","name":"Hefei-Luogang","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Hefei_Luogang_International_Airport","comments":null,"name_en":"Hefei Luogang International Airport"},"geometry":{"type":"Point","coordinates":[117.304197015887723,31.779857679577841]}},{"type":"Feature","properties":{"type":"major","name":"Hurghada Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hurghada_International_Airport","comments":null,"name_en":"Hurghada International Airport"},"geometry":{"type":"Point","coordinates":[33.807160641411784,27.180426091818589]}},{"type":"Feature","properties":{"type":"major","name":"Kharkov Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Kharkiv_International_Airport","comments":null,"name_en":"Kharkiv International Airport"},"geometry":{"type":"Point","coordinates":[36.282201077350287,49.921536063155067]}},{"type":"Feature","properties":{"type":"major","name":"Huntsville Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Huntsville_International_Airport","comments":null,"name_en":"Huntsville International Airport"},"geometry":{"type":"Point","coordinates":[-86.774943056337335,34.648334460931935]}},{"type":"Feature","properties":{"type":"mid","name":"Ibadan","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Ibadan_Airport","comments":null,"name_en":"Ibadan Airport"},"geometry":{"type":"Point","coordinates":[3.973813343322902,7.360343972693927]}},{"type":"Feature","properties":{"type":"major","name":"Kansas City Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kansas_City_International_Airport","comments":null,"name_en":"Wichita Dwight D. Eisenhower National Airport"},"geometry":{"type":"Point","coordinates":[-97.428738768397594,37.652927960390301]}},{"type":"Feature","properties":{"type":"mid","name":"Wilmington Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Wilmington_International_Airport","comments":null,"name_en":"Wilmington International Airport"},"geometry":{"type":"Point","coordinates":[-77.910375656046924,34.266784067199566]}},{"type":"Feature","properties":{"type":"mid","name":"Ilorin Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ilorin_International_Airport","comments":null,"name_en":"Ilorin International Airport"},"geometry":{"type":"Point","coordinates":[4.494840388199345,8.435376519352406]}},{"type":"Feature","properties":{"type":"mid","name":"Falls Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Falls_International_Airport","comments":null,"name_en":"Falls International Airport"},"geometry":{"type":"Point","coordinates":[-93.398002755279393,48.565993084841431]}},{"type":"Feature","properties":{"type":"mid","name":"Inverness","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Inverness_Airport","comments":null,"name_en":"Inverness Airport"},"geometry":{"type":"Point","coordinates":[-4.063591755871405,57.539500292342382]}},{"type":"Feature","properties":{"type":"mid","name":"Imperial Cty.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Imperial_County_Airport","comments":null,"name_en":"Imperial County Airport"},"geometry":{"type":"Point","coordinates":[-115.571995566579545,32.833958668552398]}},{"type":"Feature","properties":{"type":"mid","name":"Jammu","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jammu_Airport","comments":null,"name_en":"Jammu Airport"},"geometry":{"type":"Point","coordinates":[74.842307763891498,32.681042888622493]}},{"type":"Feature","properties":{"type":"mid","name":"Madurai","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Madurai_Airport","comments":null,"name_en":"Madurai International Airport"},"geometry":{"type":"Point","coordinates":[78.09113949371941,9.837186278775658]}},{"type":"Feature","properties":{"type":"major and military","name":"Jodhpur","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jodhpur_Airport","comments":null,"name_en":"Jodhpur Airport"},"geometry":{"type":"Point","coordinates":[73.050549189567121,26.26376234583514]}},{"type":"Feature","properties":{"type":"mid","name":"Jabalpur","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jabalpur_Airport","comments":null,"name_en":"Jabalpur Airport"},"geometry":{"type":"Point","coordinates":[80.058743888527701,23.1845328746465]}},{"type":"Feature","properties":{"type":"mid","name":"Kilimanjaro Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kilimanjaro_International_Airport","comments":null,"name_en":"Kilimanjaro International Airport"},"geometry":{"type":"Point","coordinates":[37.06518960677478,-3.424444959981779]}},{"type":"Feature","properties":{"type":"mid","name":"Kaduna","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kaduna_Airport","comments":null,"name_en":"Kaduna Airport"},"geometry":{"type":"Point","coordinates":[7.325253474074342,10.694619286239067]}},{"type":"Feature","properties":{"type":"mid","name":"Kananga","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kananga_Airport","comments":null,"name_en":"Kananga Airport"},"geometry":{"type":"Point","coordinates":[22.47833324826895,-5.900166562270408]}},{"type":"Feature","properties":{"type":"mid","name":"Kumasi","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kumasi_Airport","comments":null,"name_en":"Kumasi Airport"},"geometry":{"type":"Point","coordinates":[-1.592575265823615,6.714606387503645]}},{"type":"Feature","properties":{"type":"mid","name":"Viña del Mar","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Vi%C3%B1a_del_Mar_Airport","comments":null,"name_en":"Viña del Mar Airport"},"geometry":{"type":"Point","coordinates":[-71.480602535496899,-32.948391765135987]}},{"type":"Feature","properties":{"type":"mid","name":"Kanpur","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kanpur_Airport","comments":null,"name_en":"Kanpur Airport"},"geometry":{"type":"Point","coordinates":[80.41447036924616,26.40416824402508]}},{"type":"Feature","properties":{"type":"mid","name":"Kona Int'l at Keahole","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kona_International_Airport","comments":null,"name_en":"Ellison Onizuka Kona International Airport"},"geometry":{"type":"Point","coordinates":[-156.040889471057682,19.737099139944235]}},{"type":"Feature","properties":{"type":"mid","name":"Kirkwall","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Kirkwall_Airport","comments":null,"name_en":"Kirkwall Airport"},"geometry":{"type":"Point","coordinates":[-2.901378495245077,58.954428878830349]}},{"type":"Feature","properties":{"type":"mid","name":"Kota","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kota_Airport","comments":null,"name_en":"Kota Airport"},"geometry":{"type":"Point","coordinates":[75.850497794455151,25.163418716674268]}},{"type":"Feature","properties":{"type":"major and military","name":"Konya","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Konya_Airport","comments":null,"name_en":"Konya Airport"},"geometry":{"type":"Point","coordinates":[32.575673266968714,37.983994553169488]}},{"type":"Feature","properties":{"type":"major","name":"Blue Grass","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Blue_Grass_Airport","comments":null,"name_en":"Blue Grass Airport"},"geometry":{"type":"Point","coordinates":[-84.598268191878574,38.037427318137162]}},{"type":"Feature","properties":{"type":"mid","name":"Lihue","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lihu'e_Airport","comments":null,"name_en":"Lihue Airport"},"geometry":{"type":"Point","coordinates":[-159.349084290522057,21.978124316208824]}},{"type":"Feature","properties":{"type":"major","name":"Clinton National","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Little_Rock_National_Airport","comments":"fixed name","name_en":"Bill and Hillary Clinton National Airport"},"geometry":{"type":"Point","coordinates":[-92.220588131928864,34.728430041517875]}},{"type":"Feature","properties":{"type":"mid","name":"Los Mochis","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Federal_del_Valle_del_Fuerte_International_Airport","comments":null,"name_en":"Valle del Fuerte Federal International Airport"},"geometry":{"type":"Point","coordinates":[-109.082694645261029,25.688508826099021]}},{"type":"Feature","properties":{"type":"mid","name":"Venustiano Carranza Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Venustiano_Carranza_International_Airport","comments":null,"name_en":"Venustiano Carranza International Airport"},"geometry":{"type":"Point","coordinates":[-101.464960031750579,26.955392716069884]}},{"type":"Feature","properties":{"type":"mid","name":"Laredo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Laredo_International_Airport","comments":null,"name_en":"Laredo International Airport"},"geometry":{"type":"Point","coordinates":[-99.455660397651329,27.543665717582471]}},{"type":"Feature","properties":{"type":"mid","name":"Sumburgh","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Sumburgh_Airport","comments":null,"name_en":"Sumburgh Airport"},"geometry":{"type":"Point","coordinates":[-1.288060688387535,59.876689959899927]}},{"type":"Feature","properties":{"type":"major","name":"Bassel Al-Assad Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bassel_Al-Assad_International_Airport","comments":null,"name_en":"Bassel Al-Assad International Airport"},"geometry":{"type":"Point","coordinates":[35.944240709666296,35.407311459674354]}},{"type":"Feature","properties":{"type":"major","name":"London Luton","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/London_Luton_Airport","comments":null,"name_en":"London Luton Airport"},"geometry":{"type":"Point","coordinates":[-0.376227267397439,51.880295257096897]}},{"type":"Feature","properties":{"type":"mid","name":"Svalbard Longyear","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Svalbard_Airport%2C_Longyear","comments":null,"name_en":"Svalbard Airport"},"geometry":{"type":"Point","coordinates":[15.495229,78.246717]}},{"type":"Feature","properties":{"type":"mid","name":"Sangster Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Sangster_International_Airport","comments":null,"name_en":"Sangster International Airport"},"geometry":{"type":"Point","coordinates":[-77.918390763575161,18.501154929824885]}},{"type":"Feature","properties":{"type":"mid","name":"Mandalay Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mandalay_International_Airport","comments":null,"name_en":"Mandalay International Airport"},"geometry":{"type":"Point","coordinates":[95.970653595021687,21.705549068027405]}},{"type":"Feature","properties":{"type":"major","name":"Chicago Midway Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chicago_Midway_International_Airport","comments":null,"name_en":"Midway International Airport"},"geometry":{"type":"Point","coordinates":[-87.742126688561214,41.788349259740919]}},{"type":"Feature","properties":{"type":"mid and military","name":"Eloy Alfaro Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Manta_Air_Base","comments":null,"name_en":"Eloy Alfaro International Airport"},"geometry":{"type":"Point","coordinates":[-80.683384599577423,-0.949557002112883]}},{"type":"Feature","properties":{"type":"major","name":"Montgomery Reg.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Montgomery_Regional_Airport","comments":null,"name_en":"Montgomery Regional Airport"},"geometry":{"type":"Point","coordinates":[-86.390307460268616,32.304587990963064]}},{"type":"Feature","properties":{"type":"major","name":"Manchester-Boston Reg.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Manchester-Boston_Regional_Airport","comments":null,"name_en":"Manchester–Boston Regional Airport"},"geometry":{"type":"Point","coordinates":[-71.437523909185671,42.92791399458855]}},{"type":"Feature","properties":{"type":"mid","name":"Maiduguri Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Maiduguri_International_Airport","comments":null,"name_en":"Maiduguri International Airport"},"geometry":{"type":"Point","coordinates":[13.085139016247085,11.853471318852687]}},{"type":"Feature","properties":{"type":"mid","name":"Mbuji Mayi","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mbuji_Mayi_Airport","comments":null,"name_en":"Mbuji Mayi Airport"},"geometry":{"type":"Point","coordinates":[23.572109198905228,-6.124845413488115]}},{"type":"Feature","properties":{"type":"mid","name":"Minot Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Minot_International_Airport","comments":null,"name_en":"Minot International Airport"},"geometry":{"type":"Point","coordinates":[-101.291385531299881,48.255604921283911]}},{"type":"Feature","properties":{"type":"mid","name":"Missoula Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Missoula_International_Airport","comments":null,"name_en":"Missoula International Airport"},"geometry":{"type":"Point","coordinates":[-114.083694923650626,46.918760476883072]}},{"type":"Feature","properties":{"type":"mid","name":"Gen R.S. Taboada Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Rodolfo_S%C3%A1nchez_Taboada_International_Airport","comments":null,"name_en":"General Rodolfo Sánchez Taboada International Airport"},"geometry":{"type":"Point","coordinates":[-115.247874047841236,32.628564332460684]}},{"type":"Feature","properties":{"type":"major","name":"Malpensa","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Malpensa_Airport","comments":null,"name_en":"Milan–Malpensa Airport"},"geometry":{"type":"Point","coordinates":[8.712959535024368,45.627440514038092]}},{"type":"Feature","properties":{"type":"mid","name":"Norfolk Island","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Norfolk_Island_Airport","comments":null,"name_en":"Norfolk Island Airport"},"geometry":{"type":"Point","coordinates":[167.943394116204729,-29.035159255527493]}},{"type":"Feature","properties":{"type":"major","name":"Nurnberg","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nuremberg_Airport","comments":null,"name_en":"Nuremberg Airport"},"geometry":{"type":"Point","coordinates":[11.077417973909556,49.494505217034451]}},{"type":"Feature","properties":{"type":"major","name":"Odessa Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Odessa_International_Airport","comments":null,"name_en":"Odessa International Airport"},"geometry":{"type":"Point","coordinates":[30.676830831020588,46.440626875910638]}},{"type":"Feature","properties":{"type":"mid","name":"Gold Coast","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gold_Coast_Airport","comments":null,"name_en":"Gold Coast Airport"},"geometry":{"type":"Point","coordinates":[153.512876264303287,-28.166516854020163]}},{"type":"Feature","properties":{"type":"mid","name":"Oran Es Senia","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Oran_Es_S%C3%A9nia_Airport","comments":null,"name_en":"Oran Ahmed Ben Bella Airport"},"geometry":{"type":"Point","coordinates":[-0.60679696443112,35.620274731273447]}},{"type":"Feature","properties":{"type":"mid","name":"Lok Nayak Jaiprakash","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lok_Nayak_Jayaprakash_Airport","comments":null,"name_en":"Lok Nayak Jayaprakash Airport"},"geometry":{"type":"Point","coordinates":[85.090902131466322,25.594443429560453]}},{"type":"Feature","properties":{"type":"mid","name":"Paysandu","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Paysand%C3%BA_Airport","comments":null,"name_en":"Paysandú Airport"},"geometry":{"type":"Point","coordinates":[-58.068534682525701,-32.361454529272258]}},{"type":"Feature","properties":{"type":"major","name":"Paphos Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Paphos_International_Airport","comments":null,"name_en":"Paphos International Airport"},"geometry":{"type":"Point","coordinates":[32.483232206492644,34.71340128173351]}},{"type":"Feature","properties":{"type":"mid","name":"Sultan Mahmud Badaruddin II","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sultan_Mahmud_Badaruddin_II_Airport","comments":null,"name_en":"Sultan Mahmud Badaruddin II International Airport"},"geometry":{"type":"Point","coordinates":[104.699128326761624,-2.899993450059967]}},{"type":"Feature","properties":{"type":"mid","name":"Polokwane Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Polokwane_International_Airport","comments":null,"name_en":"Polokwane International Airport"},"geometry":{"type":"Point","coordinates":[29.453340364564351,-23.858986270165953]}},{"type":"Feature","properties":{"type":"mid","name":"Punta Cana","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Punta_Cana_International_Airport","comments":null,"name_en":"Punta Cana International Airport"},"geometry":{"type":"Point","coordinates":[-68.363235107464902,18.563039033987039]}},{"type":"Feature","properties":{"type":"mid","name":"Queretaro Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Quer%C3%A9taro_International_Airport","comments":null,"name_en":"Querétaro International Airport"},"geometry":{"type":"Point","coordinates":[-100.187359430029787,20.622466071277959]}},{"type":"Feature","properties":{"type":"mid","name":"Rajkot","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Rajkot_Airport","comments":null,"name_en":"Rajkot Airport"},"geometry":{"type":"Point","coordinates":[70.779954831156502,22.309281698836052]}},{"type":"Feature","properties":{"type":"major","name":"Richmond Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Richmond_International_Airport","comments":null,"name_en":"Richmond International Airport"},"geometry":{"type":"Point","coordinates":[-77.333119638113018,37.508289975090122]}},{"type":"Feature","properties":{"type":"mid","name":"Shah Makhdum","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Shah_Makhdum_Airport","comments":null,"name_en":"Shah Makhdum Airport"},"geometry":{"type":"Point","coordinates":[88.613804570443051,24.444806862303508]}},{"type":"Feature","properties":{"type":"major","name":"Greater Rochester Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Greater_Rochester_International_Airport","comments":null,"name_en":"Greater Rochester International Airport"},"geometry":{"type":"Point","coordinates":[-77.665244506219665,43.127551982648235]}},{"type":"Feature","properties":{"type":"mid","name":"Rockhampton","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Rockhampton_Airport","comments":null,"name_en":"Rockhampton Airport"},"geometry":{"type":"Point","coordinates":[150.478897,-23.378599]}},{"type":"Feature","properties":{"type":"mid","name":"Rostov-on-Don","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Rostov-on-Don_Airport","comments":null,"name_en":"Rostov-on-Don Airport"},"geometry":{"type":"Point","coordinates":[39.803514444539083,47.255111951975394]}},{"type":"Feature","properties":{"type":"mid","name":"Saratov","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Saratov_Tsentralny_Airport","comments":null,"name_en":"Saratov Tsentralny Airport"},"geometry":{"type":"Point","coordinates":[46.035023249891012,51.560645650884204]}},{"type":"Feature","properties":{"type":"mid","name":"Ramón Villeda Morales Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ram%C3%B3n_Villeda_Morales_International_Airport","comments":null,"name_en":"Ramón Villeda Morales International Airport"},"geometry":{"type":"Point","coordinates":[-87.927236512540929,15.455863052488276]}},{"type":"Feature","properties":{"type":"mid","name":"Santa Barbara Muni.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Santa_Barbara_Airport","comments":null,"name_en":"Santa Barbara Municipal Airport"},"geometry":{"type":"Point","coordinates":[-119.836601580799808,34.425731297878322]}},{"type":"Feature","properties":{"type":"mid","name":"Deadhorse","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Deadhorse_Airport","comments":null,"name_en":"Deadhorse Airport"},"geometry":{"type":"Point","coordinates":[-148.457855,70.19751]}},{"type":"Feature","properties":{"type":"mid","name":"Kangerlussuaq","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Kangerlussuaq_Airport","comments":null,"name_en":"Kangerlussuaq Airport"},"geometry":{"type":"Point","coordinates":[-50.694199,67.018097]}},{"type":"Feature","properties":{"type":"major","name":"Springfield Reg.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Springfield/Branson_National_Airport","comments":null,"name_en":"Springfield-Branson National Airport"},"geometry":{"type":"Point","coordinates":[-93.382637901200297,37.242144490302429]}},{"type":"Feature","properties":{"type":"major","name":"Shreveport Reg.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Shreveport_Regional_Airport","comments":null,"name_en":"Shreveport Regional Airport"},"geometry":{"type":"Point","coordinates":[-93.828522222950269,32.454579886651267]}},{"type":"Feature","properties":{"type":"major","name":"Simferopol Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Simferopol_International_Airport","comments":null,"name_en":"Simferopol International Airport"},"geometry":{"type":"Point","coordinates":[33.996052924453672,45.020217397816495]}},{"type":"Feature","properties":{"type":"mid","name":"Sitka Rocky Gutierrez","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sitka_Rocky_Gutierrez_Airport","comments":null,"name_en":"Sitka Rocky Gutierrez Airport"},"geometry":{"type":"Point","coordinates":[-135.365692,57.05349]}},{"type":"Feature","properties":{"type":"major","name":"Los Cabos Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Los_Cabos_International_Airport","comments":null,"name_en":"Los Cabos International Airport"},"geometry":{"type":"Point","coordinates":[-109.717858386909214,23.162657448359653]}},{"type":"Feature","properties":{"type":"major","name":"McNary Field","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/McNary_Field","comments":null,"name_en":"McNary Field"},"geometry":{"type":"Point","coordinates":[-123.007871479403931,44.910513845214247]}},{"type":"Feature","properties":{"type":"mid","name":"Plan de Guadalupe","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Plan_de_Guadalupe_International_Airport","comments":null,"name_en":"Plan de Guadalupe International Airport"},"geometry":{"type":"Point","coordinates":[-100.932260548587479,25.54799764199738]}},{"type":"Feature","properties":{"type":"major","name":"Shannon","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Shannon_Airport","comments":null,"name_en":"Shannon Airport"},"geometry":{"type":"Point","coordinates":[-8.922428855576857,52.693453710253166]}},{"type":"Feature","properties":{"type":"mid","name":"Santo Pekoa Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Santo-Pekoa_International_Airport","comments":null,"name_en":"Santo-Pekoa International Airport"},"geometry":{"type":"Point","coordinates":[167.220894919374672,-15.505538737085832]}},{"type":"Feature","properties":{"type":"mid","name":"Achmad Yani","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Achmad_Yani_Airport","comments":null,"name_en":"Achmad Yani International Airport"},"geometry":{"type":"Point","coordinates":[110.378556255665728,-6.978734849569817]}},{"type":"Feature","properties":{"type":"military mid","name":"Srinagar","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Srinagar_Airport","comments":null,"name_en":"Sheikh ul-Alam International Airport"},"geometry":{"type":"Point","coordinates":[74.782624367231136,33.983090943162317]}},{"type":"Feature","properties":{"type":"mid","name":"Tapachula Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Tapachula_International_Airport","comments":null,"name_en":"Tapachula International Airport"},"geometry":{"type":"Point","coordinates":[-92.370003,14.791128133877267]}},{"type":"Feature","properties":{"type":"major","name":"Podgorica","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Podgorica_Airport","comments":null,"name_en":"Podgorica Airport"},"geometry":{"type":"Point","coordinates":[19.246686861887266,42.367933519542824]}},{"type":"Feature","properties":{"type":"major","name":"Tallahassee Reg.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tallahassee_Regional_Airport","comments":null,"name_en":"Tallahassee International Airport"},"geometry":{"type":"Point","coordinates":[-84.344995398485764,30.395557617693783]}},{"type":"Feature","properties":{"type":"major","name":"Turin Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Turin_International_Airport","comments":null,"name_en":"Turin Airport"},"geometry":{"type":"Point","coordinates":[7.644162303621328,45.19166007346417]}},{"type":"Feature","properties":{"type":"major","name":"Taiyuan Wusu Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Taiyuan_Wusu_International_Airport","comments":null,"name_en":"Taiyuan Wusu International Airport"},"geometry":{"type":"Point","coordinates":[112.625891539315248,37.754511779151215]}},{"type":"Feature","properties":{"type":"mid","name":"Narsarsuaq","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Narsarsuaq_Airport","comments":null,"name_en":"Narsarsuaq Airport"},"geometry":{"type":"Point","coordinates":[-45.416400892310833,61.162596833732827]}},{"type":"Feature","properties":{"type":"military mid","name":"U-Tapao","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/U-Tapao_International_Airport","comments":"fixed name","name_en":"U-Tapao International Airport"},"geometry":{"type":"Point","coordinates":[101.000209290480342,12.685293091266386]}},{"type":"Feature","properties":{"type":"mid","name":"Victoria Falls","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Victoria_Falls_Airport","comments":null,"name_en":"Victoria Falls Airport"},"geometry":{"type":"Point","coordinates":[25.846767720882564,-18.099015598368197]}},{"type":"Feature","properties":{"type":"mid","name":"Vijaywada","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Vijayawada_Airport","comments":null,"name_en":"Vijayawada Airport"},"geometry":{"type":"Point","coordinates":[80.797308000067503,16.528642778235014]}},{"type":"Feature","properties":{"type":"mid","name":"Varanasi","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Varanasi_Airport","comments":null,"name_en":"Lal Bahadur Shastri Airport"},"geometry":{"type":"Point","coordinates":[82.853874191352745,25.449907732982243]}},{"type":"Feature","properties":{"type":"major","name":"Juan Gualberto Gomez","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Juan_Gualberto_G%C3%B3mez_Airport","comments":null,"name_en":"Juan Gualberto Gómez Airport"},"geometry":{"type":"Point","coordinates":[-81.436710385062312,23.039542233963147]}},{"type":"Feature","properties":{"type":"mid","name":"Villahermosa","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Carlos_Rovirosa_P%C3%A9rez_International_Airport","comments":null,"name_en":"Carlos Rovirosa Pérez International Airport"},"geometry":{"type":"Point","coordinates":[-92.819067583626179,17.993066011311075]}},{"type":"Feature","properties":{"type":"mid","name":"Brandon","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Brandon_Airport","comments":null,"name_en":"Brandon Municipal Airport"},"geometry":{"type":"Point","coordinates":[-99.945895900246342,49.904727941027694]}},{"type":"Feature","properties":{"type":"military major","name":"CFB Edmonton","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/CFB_Edmonton","comments":null,"name_en":"3rd Division Support Base"},"geometry":{"type":"Point","coordinates":[-113.478839054496859,53.67491566186677]}},{"type":"Feature","properties":{"type":"mid","name":"Iqaluit","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Iqaluit_Airport","comments":null,"name_en":"Iqaluit Airport"},"geometry":{"type":"Point","coordinates":[-68.53672924418116,63.751152353780704]}},{"type":"Feature","properties":{"type":"mid","name":"John C. Munro Hamilton Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/John_C._Munro_Hamilton_International_Airport","comments":null,"name_en":"John C. Munro Hamilton International Airport"},"geometry":{"type":"Point","coordinates":[-79.926423095996725,43.163360530509607]}},{"type":"Feature","properties":{"type":"mid","name":"Fort McMurray","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Fort_McMurray_Airport","comments":null,"name_en":"Fort McMurray International Airport"},"geometry":{"type":"Point","coordinates":[-111.223840046616914,56.656317139096188]}},{"type":"Feature","properties":{"type":"major and military","name":"Yantai","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Yantai_Laishan_International_Airport","comments":null,"name_en":"Yantai Laishan International Airport"},"geometry":{"type":"Point","coordinates":[121.372047417773118,37.407704472692394]}},{"type":"Feature","properties":{"type":"mid","name":"Peace River","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Peace_River_Airport","comments":null,"name_en":"Peace River Airport"},"geometry":{"type":"Point","coordinates":[-117.443663208081503,56.231924036744985]}},{"type":"Feature","properties":{"type":"mid","name":"Greater Moncton Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Greater_Moncton_International_Airport","comments":null,"name_en":"Greater Moncton International Airport"},"geometry":{"type":"Point","coordinates":[-64.688669680736126,46.11620596392595]}},{"type":"Feature","properties":{"type":"mid","name":"Sydney/J.A. Douglas McCurdy","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sydney_Airport_(Nova_Scotia)","comments":null,"name_en":"Sydney/J.A. Douglas McCurdy Airport"},"geometry":{"type":"Point","coordinates":[-60.046937211702641,46.167340589050362]}},{"type":"Feature","properties":{"type":"mid","name":"Resolute Bay","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Resolute_Bay_Airport","comments":null,"name_en":"Resolute Bay Airport"},"geometry":{"type":"Point","coordinates":[-94.970802324400609,74.718186098759418]}},{"type":"Feature","properties":{"type":"mid","name":"Fort Smith","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Fort_Smith_Airport","comments":null,"name_en":"Fort Smith Airport"},"geometry":{"type":"Point","coordinates":[-111.961059938157732,60.019874960244259]}},{"type":"Feature","properties":{"type":"mid","name":"Thompson","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Thompson_Airport","comments":null,"name_en":"Thompson Airport"},"geometry":{"type":"Point","coordinates":[-97.860733,55.797482]}},{"type":"Feature","properties":{"type":"mid","name":"Timmins","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Timmins_Airport","comments":null,"name_en":"Timmins/Victor M. Power Airport"},"geometry":{"type":"Point","coordinates":[-81.372047,48.566158]}},{"type":"Feature","properties":{"type":"mid","name":"Repulse Bay","location":"approximate","wikipedia":"http://en.wikipedia.org/wiki/Repulse_Bay_Airport","comments":null,"name_en":"Repulse Bay Airport"},"geometry":{"type":"Point","coordinates":[-86.25,66.533302]}},{"type":"Feature","properties":{"type":"mid","name":"Kuujjuaq","location":"approximate","wikipedia":"http://en.wikipedia.org/wiki/Kuujjuaq_Airport","comments":null,"name_en":"Kuujjuaq Airport"},"geometry":{"type":"Point","coordinates":[-68.433342,58.101959]}},{"type":"Feature","properties":{"type":"mid","name":"Wabush","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Wabush_Airport","comments":null,"name_en":"Wabush Airport"},"geometry":{"type":"Point","coordinates":[-66.873009,52.926071]}},{"type":"Feature","properties":{"type":"mid","name":"Edmonton City Centre","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Edmonton_City_Centre_(Blatchford_Field)_Airport","comments":null,"name_en":"Edmonton City Centre Airport"},"geometry":{"type":"Point","coordinates":[-113.522973688580791,53.570943658281159]}},{"type":"Feature","properties":{"type":"mid","name":"Fort St. John (N. Peace)","location":"approximate","wikipedia":"http://en.wikipedia.org/wiki/Fort_St._John_Airport","comments":null,"name_en":"Fort St. John Airport"},"geometry":{"type":"Point","coordinates":[-120.736439,56.246035]}},{"type":"Feature","properties":{"type":"mid","name":"North Bay/Jack Garland","location":"approximate","wikipedia":"http://en.wikipedia.org/wiki/North_Bay/Jack_Garland_Airport","comments":null,"name_en":"North Bay/Jack Garland Airport"},"geometry":{"type":"Point","coordinates":[-79.42491,46.358711]}},{"type":"Feature","properties":{"type":"mid","name":"Zaria","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Zaria_Airport","comments":null,"name_en":"Zaria Airport"},"geometry":{"type":"Point","coordinates":[7.687267643105769,11.135295860107082]}},{"type":"Feature","properties":{"type":"mid","name":"Skopje","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Skopje_Airport","comments":null,"name_en":"Skopje Airport"},"geometry":{"type":"Point","coordinates":[21.628197185822909,41.956454608154431]}},{"type":"Feature","properties":{"type":"mid","name":"Burnpur","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Burnpur_Airport","comments":null,"name_en":"Burnpur Airport"},"geometry":{"type":"Point","coordinates":[86.974546776572993,23.631217910776442]}},{"type":"Feature","properties":{"type":"mid","name":"Hindon Air Force Station","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Hindon_Air_Force_Station","comments":null,"name_en":"Hindan Air Force Station"},"geometry":{"type":"Point","coordinates":[77.350788877911725,28.707796860107081]}},{"type":"Feature","properties":{"type":"major","name":"Sunchon","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Sunchon_Airport","comments":null,"name_en":"Sunchon Airport"},"geometry":{"type":"Point","coordinates":[125.890825057485614,39.411965971056546]}},{"type":"Feature","properties":{"type":"mid","name":"Łódź Władysław Reymont","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/%C5%81%C3%B3d%C5%BA_W%C5%82adys%C5%82aw_Reymont_Airport","comments":null,"name_en":"Łódź Władysław Reymont Airport"},"geometry":{"type":"Point","coordinates":[19.403214874403695,51.727207045169955]}},{"type":"Feature","properties":{"type":"mid and military","name":"Alma Ata N.W.","location":"ramp","wikipedia":null,"comments":"???","name_en":"Boraldai Airport"},"geometry":{"type":"Point","coordinates":[76.878264009664761,43.355419083791865]}},{"type":"Feature","properties":{"type":"mid","name":"Jiamusi Dongjiao","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Jiamusi_Dongjiao_Airport","comments":null,"name_en":"Jiamusi Dongjiao Airport"},"geometry":{"type":"Point","coordinates":[130.456204704406787,46.843015022337944]}},{"type":"Feature","properties":{"type":"major","name":"Mudanjiang Hailang","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Mudanjiang_Hailang_Airport","comments":null,"name_en":"Mudanjiang Hailang International Airport"},"geometry":{"type":"Point","coordinates":[129.580151532220299,44.53429362999352]}},{"type":"Feature","properties":{"type":"military major","name":"Severomorsk-3 (Murmansk N.E.)","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Severomorsk-3","comments":"Planemad suggestion: https://en.wikipedia.org/wiki/Murmansk_Airport ; https://www.wikidata.org/wiki/Q1529017","name_en":"Severomorsk-3"},"geometry":{"type":"Point","coordinates":[33.290352761628533,69.016871182680404]}},{"type":"Feature","properties":{"type":"mid","name":"Mosul Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Mosul_International_Airport","comments":null,"name_en":"Mosul International Airport"},"geometry":{"type":"Point","coordinates":[43.145802,36.308601]}},{"type":"Feature","properties":{"type":"military mid","name":"Rostov N.","location":"runway","wikipedia":null,"comments":null,"name_en":"Bataysk Air Base"},"geometry":{"type":"Point","coordinates":[39.635399634366465,47.277420920286694]}},{"type":"Feature","properties":{"type":"mid","name":"Rostov S.W.","location":"runway","wikipedia":null,"comments":"??? changing places","name_en":"Rostov-on-Don Airport"},"geometry":{"type":"Point","coordinates":[39.797221534514875,47.115857725583503]}},{"type":"Feature","properties":{"type":"mid","name":"Oulu","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Oulu_Airport","comments":null,"name_en":"Oulu Airport"},"geometry":{"type":"Point","coordinates":[25.372837470430696,64.928799235884881]}},{"type":"Feature","properties":{"type":"major","name":"Bordeaux","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bordeaux_-_M%C3%A9rignac_Airport","comments":null,"name_en":"Bordeaux–Mérignac Airport"},"geometry":{"type":"Point","coordinates":[-0.701793449075243,44.832110866267385]}},{"type":"Feature","properties":{"type":"mid","name":"Mandelieu","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cannes_%E2%80%93_Mandelieu_Airport","comments":null,"name_en":"Cannes – Mandelieu Airport"},"geometry":{"type":"Point","coordinates":[6.954316120289373,43.546097987044973]}},{"type":"Feature","properties":{"type":"mid","name":"St Gatien","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Deauville_-_Saint-Gatien_Airport","comments":null,"name_en":"Deauville – Saint-Gatien Airport"},"geometry":{"type":"Point","coordinates":[0.158653528230218,49.361660998660916]}},{"type":"Feature","properties":{"type":"mid","name":"Lille-Lesquin","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lille_Airport","comments":null,"name_en":"Lille Airport"},"geometry":{"type":"Point","coordinates":[3.105964997998135,50.571642392958061]}},{"type":"Feature","properties":{"type":"major","name":"Toulouse-Blagnac","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Toulouse-Blagnac_Airport","comments":null,"name_en":"Toulouse–Blagnac Airport"},"geometry":{"type":"Point","coordinates":[1.373509185511527,43.630462566160091]}},{"type":"Feature","properties":{"type":"major","name":"Fukuoka","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Fukuoka_Airport","comments":null,"name_en":"Fukuoka Airport"},"geometry":{"type":"Point","coordinates":[130.44418954188373,33.584816433257338]}},{"type":"Feature","properties":{"type":"mid","name":"Hiroshima-Nishi","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hiroshima-Nishi_Airport","comments":null,"name_en":"Hiroshima-Nishi Airport"},"geometry":{"type":"Point","coordinates":[132.419372741681002,34.371381562882888]}},{"type":"Feature","properties":{"type":"mid","name":"Nagoya","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nagoya_Airfield","comments":null,"name_en":"Nagoya Airfield"},"geometry":{"type":"Point","coordinates":[136.919628384139912,35.254053205286695]}},{"type":"Feature","properties":{"type":"mid","name":"Sendai","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sendai_Airport","comments":null,"name_en":"Sendai Airport"},"geometry":{"type":"Point","coordinates":[140.930247381369071,38.138207561528674]}},{"type":"Feature","properties":{"type":"mid","name":"Kirkenes Hoybuktmoen","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kirkenes_Airport%2C_H%C3%B8ybuktmoen","comments":null,"name_en":"Kirkenes Airport"},"geometry":{"type":"Point","coordinates":[29.891348950040616,69.72383181136918]}},{"type":"Feature","properties":{"type":"mid","name":"Marechal Rondon Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Marechal_Rondon_International_Airport","comments":null,"name_en":"Marechal Rondon International Airport"},"geometry":{"type":"Point","coordinates":[-56.120177475472424,-15.651147019195495]}},{"type":"Feature","properties":{"type":"major","name":"Hercilio Luz Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Herc%C3%ADlio_Luz_International_Airport","comments":null,"name_en":"Florianópolis International Airport"},"geometry":{"type":"Point","coordinates":[-48.544812204959904,-27.664627694163833]}},{"type":"Feature","properties":{"type":"mid","name":"Joinville-Lauro C. de Loyola","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Joinville-Lauro_Carneiro_de_Loyola_Airport","comments":null,"name_en":"Joinville-Lauro Carneiro de Loyola Airport"},"geometry":{"type":"Point","coordinates":[-48.801649816561607,-26.224294137478456]}},{"type":"Feature","properties":{"type":"mid","name":"Presidente Castro Pinto Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Presidente_Castro_Pinto_International_Airport","comments":null,"name_en":"Presidente Castro Pinto International Airport"},"geometry":{"type":"Point","coordinates":[-34.948892591112497,-7.146174624020474]}},{"type":"Feature","properties":{"type":"major","name":"Augusto Severo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Augusto_Severo_International_Airport","comments":null,"name_en":"Augusto Severo International Airport"},"geometry":{"type":"Point","coordinates":[-35.248841016538918,-5.899120544771162]}},{"type":"Feature","properties":{"type":"major","name":"Francisco Sa Carneiro","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Francisco_S%C3%A1_Carneiro_Airport","comments":null,"name_en":"Francisco de Sá Carneiro Airport"},"geometry":{"type":"Point","coordinates":[-8.671272407196472,41.236870892045239]}},{"type":"Feature","properties":{"type":"mid","name":"Marechal Cunha Machado Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Marechal_Cunha_Machado_International_Airport","comments":null,"name_en":"Marechal Cunha Machado International Airport"},"geometry":{"type":"Point","coordinates":[-44.236234470049205,-2.583509210430185]}},{"type":"Feature","properties":{"type":"military mid","name":"Santos Air Force Base","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Santos_Air_Force_Base","comments":null,"name_en":"Santos Airbase"},"geometry":{"type":"Point","coordinates":[-46.305270493100288,-23.9237590410637]}},{"type":"Feature","properties":{"type":"mid","name":"Teresina-Senador Petronio Portella","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Teresina_Airport","comments":null,"name_en":"Teresina Airport"},"geometry":{"type":"Point","coordinates":[-42.821240231784472,-5.06346299167191]}},{"type":"Feature","properties":{"type":"mid","name":"Viracopos-Campinas Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Viracopos-Campinas_International_Airport","comments":null,"name_en":"Viracopos International Airport"},"geometry":{"type":"Point","coordinates":[-47.141079191101426,-23.009623908533911]}},{"type":"Feature","properties":{"type":"mid","name":"Eurico de Aguiar Salles","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Eurico_de_Aguiar_Salles_Airport","comments":null,"name_en":"Eurico de Aguiar Salles Airport"},"geometry":{"type":"Point","coordinates":[-40.288536875991333,-20.25741627594185]}},{"type":"Feature","properties":{"type":"major","name":"Alicante","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Alicante_Airport","comments":null,"name_en":"Alicante Airport"},"geometry":{"type":"Point","coordinates":[-0.557230440363588,38.286640899392886]}},{"type":"Feature","properties":{"type":"mid","name":"Almeria","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Almer%C3%ADa_Airport","comments":null,"name_en":"Almería Airport"},"geometry":{"type":"Point","coordinates":[-2.371601440591205,36.847767270964319]}},{"type":"Feature","properties":{"type":"mid","name":"Valencia","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Valencia_Airport","comments":null,"name_en":"Valencia Airport"},"geometry":{"type":"Point","coordinates":[-0.473474930771676,39.491459788448893]}},{"type":"Feature","properties":{"type":"mid","name":"Kiruna_Airport","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kiruna_Airport","comments":null,"name_en":"Kiruna Airport"},"geometry":{"type":"Point","coordinates":[20.335152295489802,67.825606605643202]}},{"type":"Feature","properties":{"type":"major","name":"Norrköping Airport","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Norrk%C3%B6ping_Airport","comments":"fixed name","name_en":"Norrköping Airport"},"geometry":{"type":"Point","coordinates":[16.233940769581441,58.583380501754064]}},{"type":"Feature","properties":{"type":"mid","name":"Husein Sastranegara Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Husein_Sastranegara_International_Airport","comments":null,"name_en":"Husein Sastranegara International Airport"},"geometry":{"type":"Point","coordinates":[107.575611852208922,-6.900424083534088]}},{"type":"Feature","properties":{"type":"mid","name":"Rosario – Islas Malvinas Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Rosario_%E2%80%93_Islas_Malvinas_International_Airport","comments":null,"name_en":"Rosario – Islas Malvinas International Airport"},"geometry":{"type":"Point","coordinates":[-60.780078721658633,-32.916226974381189]}},{"type":"Feature","properties":{"type":"mid","name":"Maceio/Zumbi dos Palmares Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Zumbi_dos_Palmares_International_Airport","comments":null,"name_en":"Zumbi dos Palmares International Airport"},"geometry":{"type":"Point","coordinates":[-35.792495121583293,-9.514941185401165]}},{"type":"Feature","properties":{"type":"mid","name":"Sharm el-Sheikh Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Sharm_el-Sheikh_International_Airport","comments":null,"name_en":"Sharm el-Sheikh International Airport"},"geometry":{"type":"Point","coordinates":[34.390118926728753,27.980404419916844]}},{"type":"Feature","properties":{"type":"mid","name":"Taba Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Taba_International_Airport","comments":null,"name_en":"Taba International Airport"},"geometry":{"type":"Point","coordinates":[34.775837899677896,29.594499056801894]}},{"type":"Feature","properties":{"type":"major and military","name":"Agra","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Agra_Airport","comments":null,"name_en":"Agra Civil Enclave"},"geometry":{"type":"Point","coordinates":[77.960909176509034,27.157727734749972]}},{"type":"Feature","properties":{"type":"mid","name":"Vadodara","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Vadodara_Airport","comments":null,"name_en":"Vadodara Airport"},"geometry":{"type":"Point","coordinates":[73.226288953323902,22.33616400211708]}},{"type":"Feature","properties":{"type":"mid","name":"Shahid Ashrafi Esfahani","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Shahid_Ashrafi_Esfahani_Airport","comments":null,"name_en":"Kermanshah Airport"},"geometry":{"type":"Point","coordinates":[47.156583516563856,34.346416773910811]}},{"type":"Feature","properties":{"type":"mid","name":"Benina Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Benina_International_Airport","comments":null,"name_en":"Benina International Airport"},"geometry":{"type":"Point","coordinates":[20.268039801851568,32.087277460655308]}},{"type":"Feature","properties":{"type":"military major","name":"King Abdulaziz AB","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Dhahran_International_Airport","comments":"redirected here \"(RedirectedfromKingAbdul-AzizAirBase(RSAF))\"","name_en":"King Abdulaziz Air Base"},"geometry":{"type":"Point","coordinates":[50.147724572784398,26.270368085476772]}},{"type":"Feature","properties":{"type":"mid","name":"Nueva Hespérides Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Nueva_Hesperides_International_Airport","comments":null,"name_en":"Nueva Hespérides International Airport"},"geometry":{"type":"Point","coordinates":[-57.984082117649237,-31.437388338779797]}},{"type":"Feature","properties":{"type":"spaceport","name":"Baikonur Cosmodrome","location":"approximate","wikipedia":"http://en.wikipedia.org/wiki/Baikonur_Cosmodrome","comments":null,"name_en":"Baikonur Cosmodrome"},"geometry":{"type":"Point","coordinates":[63.307354423875047,45.963573940312365]}},{"type":"Feature","properties":{"type":"spaceport","name":"Kennedy Space Center","location":"approximate","wikipedia":"http://en.wikipedia.org/wiki/John_F._Kennedy_Space_Center","comments":null,"name_en":"Kennedy Space Center"},"geometry":{"type":"Point","coordinates":[-80.636968091189203,28.516370477202706]}},{"type":"Feature","properties":{"type":"spaceport","name":"Centre Spatial Guyanais","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Guiana_Space_Centre","comments":null,"name_en":"Guiana Space Centre"},"geometry":{"type":"Point","coordinates":[-52.76842968934524,5.239410012580352]}},{"type":"Feature","properties":{"type":"mid","name":"Queen Beatrix Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Queen_Beatrix_International_Airport","comments":null,"name_en":"Queen Beatrix International Airport"},"geometry":{"type":"Point","coordinates":[-70.007622856349641,12.503464363029721]}},{"type":"Feature","properties":{"type":"mid","name":"Djibouti-Ambouli Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Djibouti-Ambouli_International_Airport","comments":null,"name_en":"Djibouti-Ambouli International Airport"},"geometry":{"type":"Point","coordinates":[43.149712785995575,11.552101823017216]}},{"type":"Feature","properties":{"type":"mid and military","name":"Diego Aracena Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Diego_Aracena_International_Airport","comments":null,"name_en":"Diego Aracena International Airport"},"geometry":{"type":"Point","coordinates":[-70.178635395532979,-20.547840087830867]}},{"type":"Feature","properties":{"type":"major","name":"Sabiha Gökçen Havaalani","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sabiha_G%C3%B6k%C3%A7en_International_Airport","comments":null,"name_en":"Istanbul Sabiha Gökçen International Airport"},"geometry":{"type":"Point","coordinates":[29.309599142388944,40.904300355395733]}},{"type":"Feature","properties":{"type":"mid","name":"Kosrae Island","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Kosrae_International_Airport","comments":null,"name_en":"Kosrae International Airport"},"geometry":{"type":"Point","coordinates":[162.957041225076125,5.352009857182798]}},{"type":"Feature","properties":{"type":"mid","name":"Funafuti Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Funafuti_International_Airport","comments":null,"name_en":"Funafuti International Airport"},"geometry":{"type":"Point","coordinates":[179.195442023020007,-8.524854150594241]}},{"type":"Feature","properties":{"type":"mid","name":"Dr. Babasaheb Ambedkar Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dr._Babasaheb_Ambedkar_International_Airport","comments":null,"name_en":"Dr. Babasaheb Ambedkar International Airport"},"geometry":{"type":"Point","coordinates":[79.053797642198603,21.089931763008746]}},{"type":"Feature","properties":{"type":"mid","name":"Phuket Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Phuket_International_Airport","comments":null,"name_en":"Phuket International Airport"},"geometry":{"type":"Point","coordinates":[98.306038490055911,8.107684759527347]}},{"type":"Feature","properties":{"type":"mid","name":"Nadi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nadi_International_Airport","comments":null,"name_en":"Nadi International Airport"},"geometry":{"type":"Point","coordinates":[177.451151198059478,-17.752912947979222]}},{"type":"Feature","properties":{"type":"mid","name":"Lic. Jesús Terán Peredo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lic._Jes%C3%BAs_Ter%C3%A1n_Peredo_International_Airport","comments":null,"name_en":"Lic. Jesús Terán Peredo International Airport"},"geometry":{"type":"Point","coordinates":[-102.314093740057899,21.701339032920746]}},{"type":"Feature","properties":{"type":"mid","name":"Albenga","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Villanova_d'Albenga_International_Airport","comments":null,"name_en":"Albenga Airport-Riviera Airport"},"geometry":{"type":"Point","coordinates":[8.123145354364089,44.04587735981584]}},{"type":"Feature","properties":{"type":"major","name":"Queen Alia Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Queen_Alia_International_Airport","comments":null,"name_en":"Queen Alia International Airport"},"geometry":{"type":"Point","coordinates":[35.989707162192985,31.722662160043214]}},{"type":"Feature","properties":{"type":"mid","name":"Chacalluta Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chacalluta_Airport","comments":null,"name_en":"Chacalluta International Airport"},"geometry":{"type":"Point","coordinates":[-70.335730141095894,-18.349206163957913]}},{"type":"Feature","properties":{"type":"mid","name":"Atar Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Atar_International_Airport","comments":null,"name_en":"Atar International Airport"},"geometry":{"type":"Point","coordinates":[-13.05117043233154,20.498270610156464]}},{"type":"Feature","properties":{"type":"mid","name":"Ernesto Cortissoz Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ernesto_Cortissoz_International_Airport","comments":null,"name_en":"Ernesto Cortissoz International Airport"},"geometry":{"type":"Point","coordinates":[-74.776555978264952,10.886677595941366]}},{"type":"Feature","properties":{"type":"mid","name":"Teniente Luis Candelaria Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/San_Carlos_de_Bariloche_Airport","comments":null,"name_en":"San Carlos de Bariloche Airport"},"geometry":{"type":"Point","coordinates":[-71.161430086976324,-41.145997695810507]}},{"type":"Feature","properties":{"type":"mid","name":"Bouaké","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bouak%C3%A9_Airport","comments":null,"name_en":"Bouaké Airport"},"geometry":{"type":"Point","coordinates":[-5.068942222753114,7.736104955550318]}},{"type":"Feature","properties":{"type":"major","name":"Philip S. W. Goldson Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Philip_S._W._Goldson_International_Airport","comments":null,"name_en":"Philip S. W. Goldson International Airport"},"geometry":{"type":"Point","coordinates":[-88.308206403307466,17.536068657552093]}},{"type":"Feature","properties":{"type":"major","name":"Corpus Christi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Corpus_Christi_International_Airport","comments":null,"name_en":"Corpus Christi International Airport"},"geometry":{"type":"Point","coordinates":[-97.502267871029758,27.774456070082259]}},{"type":"Feature","properties":{"type":"mid","name":"Hato Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hato_International_Airport","comments":null,"name_en":"Hato International Airport"},"geometry":{"type":"Point","coordinates":[-68.956878807276112,12.184834605201921]}},{"type":"Feature","properties":{"type":"major","name":"Velazco Astete Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Alejandro_Velasco_Astete_International_Airport","comments":null,"name_en":"Alejandro Velasco Astete International Airport"},"geometry":{"type":"Point","coordinates":[-71.943664144972161,-13.538218699263911]}},{"type":"Feature","properties":{"type":"mid","name":"Julius Nyerere Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Julius_Nyerere_International_Airport","comments":null,"name_en":"Julius Nyerere International Airport"},"geometry":{"type":"Point","coordinates":[39.207471503916466,-6.866720042491186]}},{"type":"Feature","properties":{"type":"mid","name":"Detroit City","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Coleman_A._Young_International_Airport","comments":null,"name_en":"Coleman A. Young International Airport"},"geometry":{"type":"Point","coordinates":[-83.003968141773342,42.409093843190682]}},{"type":"Feature","properties":{"type":"mid","name":"Presidente Nicolau Lobato Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Presidente_Nicolau_Lobato_International_Airport","comments":null,"name_en":"Presidente Nicolau Lobato International Airport"},"geometry":{"type":"Point","coordinates":[125.524854209182081,-8.549311574145644]}},{"type":"Feature","properties":{"type":"major","name":"Moscow Domodedovo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Domodedovo_International_Airport","comments":null,"name_en":"Domodedovo International Airport"},"geometry":{"type":"Point","coordinates":[37.900253128945167,55.414152822302292]}},{"type":"Feature","properties":{"type":"mid","name":"Dunedin Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dunedin_International_Airport","comments":null,"name_en":"Dunedin International Airport"},"geometry":{"type":"Point","coordinates":[170.200027,-45.923431]}},{"type":"Feature","properties":{"type":"mid","name":"Dzaoudzi Pamanzi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dzaoudzi_Pamandzi_International_Airport","comments":null,"name_en":"Dzaoudzi Pamandzi International Airport"},"geometry":{"type":"Point","coordinates":[45.281786419789874,-12.804947438164319]}},{"type":"Feature","properties":{"type":"mid","name":"El Paso Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/El_Paso_International_Airport","comments":null,"name_en":"El Paso International Airport"},"geometry":{"type":"Point","coordinates":[-106.395714679365668,31.799086027258937]}},{"type":"Feature","properties":{"type":"major","name":"Zvartnots Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Zvartnots_International_Airport","comments":null,"name_en":"Zvartnots International Airport"},"geometry":{"type":"Point","coordinates":[44.400063053693842,40.152367945188438]}},{"type":"Feature","properties":{"type":"major","name":"Fort Worth Meacham Field","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Fort_Worth_Meacham_International_Airport","comments":null,"name_en":"Fort Worth Meacham International Airport"},"geometry":{"type":"Point","coordinates":[-97.355134856158656,32.820752904797232]}},{"type":"Feature","properties":{"type":"mid","name":"JAGS McCartney Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/JAGS_McCartney_International_Airport","comments":null,"name_en":"JAGS McCartney International Airport"},"geometry":{"type":"Point","coordinates":[-71.146133744887564,21.442123743906283]}},{"type":"Feature","properties":{"type":"mid","name":"Scholes Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Scholes_International_Airport_at_Galveston","comments":null,"name_en":"Scholes International Airport at Galveston"},"geometry":{"type":"Point","coordinates":[-94.855401387626387,29.267123921209599]}},{"type":"Feature","properties":{"type":"mid","name":"Goma Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Goma_International_Airport","comments":null,"name_en":"Goma International Airport"},"geometry":{"type":"Point","coordinates":[29.240053495222842,-1.658317950020695]}},{"type":"Feature","properties":{"type":"mid","name":"Garoua Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Garoua_International_Airport","comments":null,"name_en":"Garoua International Airport"},"geometry":{"type":"Point","coordinates":[13.372430937787765,9.33068867678854]}},{"type":"Feature","properties":{"type":"major","name":"Antonio B. Won Pat Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Antonio_B._Won_Pat_International_Airport","comments":null,"name_en":"Antonio B. Won Pat International Airport"},"geometry":{"type":"Point","coordinates":[144.805850357092595,13.492646235946513]}},{"type":"Feature","properties":{"type":"mid","name":"Gary/Chicago Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gary/Chicago_International_Airport","comments":null,"name_en":"Gary/Chicago International Airport"},"geometry":{"type":"Point","coordinates":[-87.408359624740555,41.617793001516596]}},{"type":"Feature","properties":{"type":"mid","name":"Prince Said Ibrahim Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Prince_Said_Ibrahim_International_Airport","comments":null,"name_en":"Prince Said Ibrahim International Airport"},"geometry":{"type":"Point","coordinates":[43.274561217961576,-11.536639382912684]}},{"type":"Feature","properties":{"type":"mid","name":"Hobart Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hobart_International_Airport","comments":null,"name_en":"Hobart Airport"},"geometry":{"type":"Point","coordinates":[147.50599619040787,-42.837608369482211]}},{"type":"Feature","properties":{"type":"mid","name":"Honiara Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Honiara_International_Airport","comments":null,"name_en":"Honiara International Airport"},"geometry":{"type":"Point","coordinates":[160.045855129924519,-9.427575664001457]}},{"type":"Feature","properties":{"type":"mid","name":"Kiev Zhuliany Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kiev_International_Airport","comments":null,"name_en":"Kyiv Zhuliany International Airport"},"geometry":{"type":"Point","coordinates":[30.445130518210362,50.412808165984956]}},{"type":"Feature","properties":{"type":"mid and military","name":"Irkutsk S.E.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Irkutsk_Airport","comments":null,"name_en":"Irkutsk International Airport"},"geometry":{"type":"Point","coordinates":[104.355859748002416,52.272889388224414]}},{"type":"Feature","properties":{"type":"major","name":"Indianapolis Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Indianapolis_International_Airport","comments":null,"name_en":"Indianapolis International Airport"},"geometry":{"type":"Point","coordinates":[-86.273400365088548,39.730204370396905]}},{"type":"Feature","properties":{"type":"mid","name":"Nauru Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Nauru_International_Airport","comments":null,"name_en":"Nauru International Airport"},"geometry":{"type":"Point","coordinates":[166.91613965881993,-0.545037226856384]}},{"type":"Feature","properties":{"type":"mid","name":"Mataveri Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mataveri_International_Airport","comments":null,"name_en":"Mataveri International Airport"},"geometry":{"type":"Point","coordinates":[-109.430064410009606,-27.158773838853794]}},{"type":"Feature","properties":{"type":"mid","name":"Gob. Horacio Guzman Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gobernador_Horacio_Guzm%C3%A1n_International_Airport","comments":null,"name_en":"Gobernador Horacio Guzmán International Airport"},"geometry":{"type":"Point","coordinates":[-65.093766545881223,-24.386101077584634]}},{"type":"Feature","properties":{"type":"mid","name":"Nanchang Changbei Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nanchang_Changbei_International_Airport","comments":null,"name_en":"Nanchang Changbei International Airport"},"geometry":{"type":"Point","coordinates":[115.911979918602214,28.862489120066552]}},{"type":"Feature","properties":{"type":"major","name":"Kunming Changshui Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kunming_Wujiaba_International_Airport","comments":null,"name_en":"Kunming Changshui International Airport"},"geometry":{"type":"Point","coordinates":[102.928522759264595,25.101205531845622]}},{"type":"Feature","properties":{"type":"major","name":"Leeds Bradford","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Leeds_Bradford_International_Airport","comments":null,"name_en":"Leeds Bradford Airport"},"geometry":{"type":"Point","coordinates":[-1.659831067347459,53.869081947443433]}},{"type":"Feature","properties":{"type":"mid","name":"Libreville Leon M'ba Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Libreville_International_Airport","comments":null,"name_en":"Libreville International Airport"},"geometry":{"type":"Point","coordinates":[9.410223378207123,0.457139229503759]}},{"type":"Feature","properties":{"type":"mid","name":"Lomé Tokoin","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lom%C3%A9-Tokoin_Airport","comments":null,"name_en":"Lomé-Tokoin Airport"},"geometry":{"type":"Point","coordinates":[1.25093205640014,6.16687362722297]}},{"type":"Feature","properties":{"type":"mid and military","name":"Lviv Danylo Halytskyi Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Lviv_International_Airport","comments":null,"name_en":"Lviv Danylo Halytskyi International Airport"},"geometry":{"type":"Point","coordinates":[23.946126959894446,49.817850605000466]}},{"type":"Feature","properties":{"type":"mid","name":"Marshall Islands Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Marshall_Islands_International_Airport","comments":null,"name_en":"Marshall Islands International Airport"},"geometry":{"type":"Point","coordinates":[171.281919370647955,7.068118485570912]}},{"type":"Feature","properties":{"type":"major","name":"Macau Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Macau_International_Airport","comments":null,"name_en":"Macau International Airport"},"geometry":{"type":"Point","coordinates":[113.574512948619514,22.157657252963361]}},{"type":"Feature","properties":{"type":"mid","name":"Aden Adde Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Aden_Adde_International_Airport","comments":null,"name_en":"Aden Adde International Airport"},"geometry":{"type":"Point","coordinates":[45.303637418620177,2.016353112149878]}},{"type":"Feature","properties":{"type":"mid","name":"Maputo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Maputo_International_Airport","comments":null,"name_en":"Maputo International Airport"},"geometry":{"type":"Point","coordinates":[32.574191519478241,-25.924276711787034]}},{"type":"Feature","properties":{"type":"mid","name":"Sir Seewoosagur Ramgoolam Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sir_Seewoosagur_Ramgoolam_International_Airport","comments":null,"name_en":"Sir Seewoosagur Ramgoolam International Airport"},"geometry":{"type":"Point","coordinates":[57.676986007663551,-20.431756779321564]}},{"type":"Feature","properties":{"type":"major","name":"Naples Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Naples_International_Airport","comments":null,"name_en":"Naples International Airport"},"geometry":{"type":"Point","coordinates":[14.282844434020328,40.878072884363888]}},{"type":"Feature","properties":{"type":"mid","name":"Nouadhibou Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Nouadhibou_International_Airport","comments":null,"name_en":"Nouadhibou International Airport"},"geometry":{"type":"Point","coordinates":[-17.033439869153838,20.929052306438731]}},{"type":"Feature","properties":{"type":"major","name":"Ningbo Lishe Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ningbo_Lishe_International_Airport","comments":null,"name_en":"Ningbo Lishe International Airport"},"geometry":{"type":"Point","coordinates":[121.461819388483661,29.820823190686056]}},{"type":"Feature","properties":{"type":"mid","name":"Nouakchott Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nouakchott_International_Airport","comments":"CHANGED\"TheairportopenedinJune2016asthereplacementforNouakchottInternationalAirport.\" !!!modify the GPS!!! https://en.wikipedia.org/wiki/Nouakchott%E2%80%93Oumtounsy_International_Airport","name_en":"Nouakchott–Oumtounsy International Airport"},"geometry":{"type":"Point","coordinates":[-15.95192592522014,18.097923171817449]}},{"type":"Feature","properties":{"type":"mid","name":"La Tontouta Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/La_Tontouta_International_Airport","comments":null,"name_en":"La Tontouta International Airport"},"geometry":{"type":"Point","coordinates":[166.217232118698718,-22.013638624898107]}},{"type":"Feature","properties":{"type":"major","name":"Oakland Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Oakland_International_Airport","comments":null,"name_en":"Oakland International Airport"},"geometry":{"type":"Point","coordinates":[-122.213261257863323,37.712303695169119]}},{"type":"Feature","properties":{"type":"major","name":"Ontario Int'l","location":"parking","wikipedia":"http://en.wikipedia.org/wiki/LA/Ontario_International_Airport","comments":null,"name_en":"LA/Ontario International Airport"},"geometry":{"type":"Point","coordinates":[-117.592327651650606,34.060191102065957]}},{"type":"Feature","properties":{"type":"major","name":"Cork","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cork_Airport","comments":null,"name_en":"Cork Airport"},"geometry":{"type":"Point","coordinates":[-8.490141999838173,51.84854054199235]}},{"type":"Feature","properties":{"type":"mid","name":"Minangkabau Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Minangkabau_International_Airport","comments":"ok","name_en":"Minangkabau International Airport"},"geometry":{"type":"Point","coordinates":[100.285455851791326,-0.786045714026273]}},{"type":"Feature","properties":{"type":"mid","name":"João Paulo II","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Jo%C3%A3o_Paulo_II_Airport","comments":null,"name_en":"João Paulo II Airport"},"geometry":{"type":"Point","coordinates":[-25.696988219871116,37.743331647293275]}},{"type":"Feature","properties":{"type":"mid","name":"Bacha Khan Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Peshawar_International_Airport","comments":null,"name_en":"Bacha Khan International Airport"},"geometry":{"type":"Point","coordinates":[71.51881499126668,33.99140278895964]}},{"type":"Feature","properties":{"type":"mid","name":"Glasgow Prestwick","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Glasgow_Prestwick_International_Airport","comments":null,"name_en":"Glasgow Prestwick Airport"},"geometry":{"type":"Point","coordinates":[-4.610971639010682,55.508891810514207]}},{"type":"Feature","properties":{"type":"mid","name":"Ponta Porã Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ponta_Por%C3%A3_International_Airport","comments":null,"name_en":"Ponta Porã International Airport"},"geometry":{"type":"Point","coordinates":[-55.706079374857282,-22.551786560876014]}},{"type":"Feature","properties":{"type":"mid","name":"Palmerston N. Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Palmerston_North_International_Airport","comments":null,"name_en":"Palmerston North International Airport"},"geometry":{"type":"Point","coordinates":[175.621283281959847,-40.323317885205483]}},{"type":"Feature","properties":{"type":"mid","name":"Pohnpei Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Pohnpei_International_Airport","comments":null,"name_en":"Pohnpei International Airport"},"geometry":{"type":"Point","coordinates":[158.203304490964399,6.981306765121233]}},{"type":"Feature","properties":{"type":"mid","name":"Tahiti Faa'a Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Faa'a_International_Airport","comments":null,"name_en":"Faa'a International Airport"},"geometry":{"type":"Point","coordinates":[-149.609757932428721,-17.559457765994249]}},{"type":"Feature","properties":{"type":"major and military","name":"Pisa Galileo Galilei Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Galileo_Galilei_International_Airport","comments":null,"name_en":"Pisa International Airport"},"geometry":{"type":"Point","coordinates":[10.400134371805603,43.698322415766413]}},{"type":"Feature","properties":{"type":"mid and military","name":"Port Sudan","location":"runway","wikipedia":null,"comments":null,"name_en":"Port Sudan"},"geometry":{"type":"Point","coordinates":[37.216065757541976,19.576063653196776]}},{"type":"Feature","properties":{"type":"mid","name":"Praia Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Praia_International_Airport","comments":null,"name_en":"Praia International Airport"},"geometry":{"type":"Point","coordinates":[-23.486201988358683,14.944988935283243]}},{"type":"Feature","properties":{"type":"mid","name":"Marrakech-Menara","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Menara_International_Airport","comments":null,"name_en":"Marrakesh Menara Airport"},"geometry":{"type":"Point","coordinates":[-8.024605359079887,31.60229465977643]}},{"type":"Feature","properties":{"type":"mid","name":"Rarotonga Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Rarotonga_International_Airport","comments":null,"name_en":"Rarotonga International Airport"},"geometry":{"type":"Point","coordinates":[-159.798156308387291,-21.20098217246316]}},{"type":"Feature","properties":{"type":"major","name":"Siem Reap Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Angkor_International_Airport","comments":null,"name_en":"Siem Reap International Airport"},"geometry":{"type":"Point","coordinates":[103.815780528111546,13.408796969353801]}},{"type":"Feature","properties":{"type":"mid","name":"Hermes Quijada Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hermes_Quijada_Airport","comments":null,"name_en":"Rio Grande Airport"},"geometry":{"type":"Point","coordinates":[-67.753026846267531,-53.781474605831598]}},{"type":"Feature","properties":{"type":"mid","name":"Piloto Civil Norberto Fernandez Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Piloto_Civil_Norberto_Fern%C3%A1ndez_International_Airport","comments":null,"name_en":"Piloto Civil Norberto Fernández International Airport"},"geometry":{"type":"Point","coordinates":[-69.306471177673089,-51.611698085540191]}},{"type":"Feature","properties":{"type":"major","name":"Reno-Tahoe Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Reno-Tahoe_International_Airport","comments":null,"name_en":"Reno–Tahoe International Airport"},"geometry":{"type":"Point","coordinates":[-119.775283308104861,39.505849901470334]}},{"type":"Feature","properties":{"type":"mid","name":"Roman Tmetuchl Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Palau_International_Airport","comments":null,"name_en":"Roman Tmetuchl International Airport"},"geometry":{"type":"Point","coordinates":[134.532953466158688,7.364495536129204]}},{"type":"Feature","properties":{"type":"mid","name":"Amilcar Cabral Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Am%C3%ADlcar_Cabral_International_Airport","comments":null,"name_en":"Amílcar Cabral International Airport"},"geometry":{"type":"Point","coordinates":[-22.944057407964799,16.734793269338514]}},{"type":"Feature","properties":{"type":"major","name":"Sarajevo","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sarajevo_International_Airport","comments":null,"name_en":"Sarajevo International Airport"},"geometry":{"type":"Point","coordinates":[18.336618545712724,43.825887224679725]}},{"type":"Feature","properties":{"type":"mid","name":"Robert L. Bradshaw Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Robert_L._Bradshaw_International_Airport","comments":null,"name_en":"Robert L. Bradshaw International Airport"},"geometry":{"type":"Point","coordinates":[-62.714212504731584,17.311125840442042]}},{"type":"Feature","properties":{"type":"mid","name":"Martín Miguel de Güemes Int","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mart%C3%ADn_Miguel_de_G%C3%BCemes_Airport","comments":null,"name_en":"Martín Miguel de Güemes International Airport"},"geometry":{"type":"Point","coordinates":[-65.47847604377958,-24.844374271331539]}},{"type":"Feature","properties":{"type":"mid","name":"Saipan Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Saipan_International_Airport","comments":null,"name_en":"Saipan International Airport"},"geometry":{"type":"Point","coordinates":[145.723694658637612,15.121516719766413]}},{"type":"Feature","properties":{"type":"mid","name":"Juana Azurduy de Padilla Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Juana_Azurduy_de_Padilla_International_Airport","comments":null,"name_en":"Juana Azurduy de Padilla International Airport"},"geometry":{"type":"Point","coordinates":[-65.292863138784654,-19.013915792465738]}},{"type":"Feature","properties":{"type":"major","name":"Princess Juliana Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Princess_Juliana_International_Airport","comments":null,"name_en":"Princess Juliana International Airport"},"geometry":{"type":"Point","coordinates":[-63.112276085860202,18.042244021474033]}},{"type":"Feature","properties":{"type":"mid","name":"Ta'izz Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ta'izz_International_Airport","comments":null,"name_en":"Ta'izz International Airport"},"geometry":{"type":"Point","coordinates":[44.134782731062046,13.685497002557412]}},{"type":"Feature","properties":{"type":"mid","name":"Qingdao Liuting Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Qingdao_Liuting_International_Airport","comments":null,"name_en":"Qingdao Liuting International Airport"},"geometry":{"type":"Point","coordinates":[120.380685949060506,36.267757808103866]}},{"type":"Feature","properties":{"type":"mid","name":"Chuuk Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chuuk_International_Airport","comments":null,"name_en":"Chuuk International Airport"},"geometry":{"type":"Point","coordinates":[151.842046037403264,7.457617802884429]}},{"type":"Feature","properties":{"type":"mid","name":"Tangier Ibn Battouta","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tangier_Ibn_Battouta_Airport","comments":null,"name_en":"Tangier Ibn Battouta Airport"},"geometry":{"type":"Point","coordinates":[-5.912880876559137,35.725765640927385]}},{"type":"Feature","properties":{"type":"mid","name":"Bonriki Int'l","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Bonriki_International_Airport","comments":null,"name_en":"Bonriki International Airport"},"geometry":{"type":"Point","coordinates":[173.145990795301373,1.380668697538304]}},{"type":"Feature","properties":{"type":"major","name":"Astana Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Astana_International_Airport","comments":null,"name_en":"Nursultan Nazarbayev International Airport"},"geometry":{"type":"Point","coordinates":[71.460944139993572,51.026935290771199]}},{"type":"Feature","properties":{"type":"major","name":"Tianjin Binhai Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tianjin_Binhai_International_Airport","comments":null,"name_en":"Tianjin Binhai International Airport"},"geometry":{"type":"Point","coordinates":[117.352723159918526,39.129460990900753]}},{"type":"Feature","properties":{"type":"major and military","name":"Townsville","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Townsville_Airport","comments":null,"name_en":"Townsville Airport"},"geometry":{"type":"Point","coordinates":[146.770678904770023,-19.256181437621244]}},{"type":"Feature","properties":{"type":"mid","name":"Teniente Gen. Benjamin Matienzo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Benjam%C3%ADn_Matienzo_International_Airport","comments":null,"name_en":"Teniente Benjamín Matienzo International Airport"},"geometry":{"type":"Point","coordinates":[-65.108124623624818,-26.835731005071423]}},{"type":"Feature","properties":{"type":"major","name":"Aeroport Tunis","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tunis-Carthage_International_Airport","comments":null,"name_en":"Tunis–Carthage International Airport"},"geometry":{"type":"Point","coordinates":[10.21769924471112,36.847448217721933]}},{"type":"Feature","properties":{"type":"major","name":"Tucson Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tucson_International_Airport","comments":null,"name_en":"Tucson International Airport"},"geometry":{"type":"Point","coordinates":[-110.937713232131955,32.12035234418979]}},{"type":"Feature","properties":{"type":"mid","name":"Chinggis Khaan Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chinggis_Khaan_International_Airport","comments":null,"name_en":"Chinggis Khaan International Airport"},"geometry":{"type":"Point","coordinates":[106.762873994928583,47.852526096668434]}},{"type":"Feature","properties":{"type":"major","name":"Ürümqi Diwopu Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/%C3%9Cr%C3%BCmqi_Diwopu_International_Airport","comments":null,"name_en":"Ürümqi Diwopu International Airport"},"geometry":{"type":"Point","coordinates":[87.467129848780843,43.898338219365286]}},{"type":"Feature","properties":{"type":"mid","name":"Bauerfield Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bauerfield_International_Airport","comments":null,"name_en":"Bauerfield International Airport"},"geometry":{"type":"Point","coordinates":[168.319622739661611,-17.701699068178094]}},{"type":"Feature","properties":{"type":"mid","name":"Wewak Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Wewak_International_Airport","comments":null,"name_en":"Wewak Airport"},"geometry":{"type":"Point","coordinates":[143.669102299697585,-3.580226894447444]}},{"type":"Feature","properties":{"type":"military mid","name":"Châlons Vatry","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ch%C3%A2lons_Vatry_Airport","comments":null,"name_en":"Châlons Vatry Airport"},"geometry":{"type":"Point","coordinates":[4.19111982574289,48.780394613856643]}},{"type":"Feature","properties":{"type":"major","name":"Xiamen Gaoqi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Xiamen_Gaoqi_International_Airport","comments":null,"name_en":"Xiamen Gaoqi International Airport"},"geometry":{"type":"Point","coordinates":[118.12696884672026,24.537192570557004]}},{"type":"Feature","properties":{"type":"mid","name":"Yap Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Yap_International_Airport","comments":null,"name_en":"Yap International Airport"},"geometry":{"type":"Point","coordinates":[138.086430283619165,9.497917333613481]}},{"type":"Feature","properties":{"type":"mid","name":"Playa de Oro Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Playa_de_Oro_International_Airport","comments":null,"name_en":"Playa de Oro International Airport"},"geometry":{"type":"Point","coordinates":[-104.560095200097479,19.148086028585354]}},{"type":"Feature","properties":{"type":"mid","name":"Cayenne – Rochambeau","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cayenne-Rochambeau_Airport","comments":"???","name_en":"Cayenne – Félix Eboué Airport"},"geometry":{"type":"Point","coordinates":[-52.363806857235694,4.821267143089237]}},{"type":"Feature","properties":{"type":"mid","name":"Irkutsk N.W.","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Irkutsk_Northwest_Airport","comments":null,"name_en":"Irkutsk Northwest Airport"},"geometry":{"type":"Point","coordinates":[104.197359284494041,52.361647670013149]}},{"type":"Feature","properties":{"type":"major","name":"Shijiazhuang Zhengding Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Shijiazhuang_Zhengding_International_Airport","comments":null,"name_en":"Shijiazhuang Zhengding International Airport"},"geometry":{"type":"Point","coordinates":[114.692266598901597,38.278140913112018]}},{"type":"Feature","properties":{"type":"major","name":"Heydar Aliyev Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Heydar_Aliyev_International_Airport","comments":null,"name_en":"Heydar Aliyev International Airport"},"geometry":{"type":"Point","coordinates":[50.04983948674051,40.462746883908032]}},{"type":"Feature","properties":{"type":"military mid","name":"Lakatamia Airbase","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/List_of_airports_in_Cyprus","comments":null,"name_en":null},"geometry":{"type":"Point","coordinates":[33.322201334898956,35.106344806736189]}},{"type":"Feature","properties":{"type":"mid","name":"Cabo Frio Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cabo_Frio_International_Airport","comments":null,"name_en":"Cabo Frio International Airport"},"geometry":{"type":"Point","coordinates":[-42.079251752018415,-22.925631709132773]}},{"type":"Feature","properties":{"type":"mid","name":"Helsinki-Malmi","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Helsinki-Malmi_Airport","comments":null,"name_en":"Helsinki-Malmi Airport"},"geometry":{"type":"Point","coordinates":[25.045535369831455,60.249377849958677]}},{"type":"Feature","properties":{"type":"major","name":"Luxembourg-Findel","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Luxembourg-Findel_International_Airport","comments":null,"name_en":"Luxembourg Airport"},"geometry":{"type":"Point","coordinates":[6.216421217287305,49.634304092510163]}},{"type":"Feature","properties":{"type":"major","name":"Venice Marco Polo","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Marco_Polo_International_Airport","comments":null,"name_en":"Venice Marco Polo Airport"},"geometry":{"type":"Point","coordinates":[12.341067300436913,45.504847758845486]}},{"type":"Feature","properties":{"type":"mid","name":"Yangyang Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Yangyang_International_Airport","comments":null,"name_en":"Yangyang International Airport"},"geometry":{"type":"Point","coordinates":[128.662988668839574,38.058782416258545]}},{"type":"Feature","properties":{"type":"mid","name":"Tabatinga Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tabatinga_International_Airport","comments":null,"name_en":"Tabatinga International Airport"},"geometry":{"type":"Point","coordinates":[-69.939473933908985,-4.250324694933793]}},{"type":"Feature","properties":{"type":"mid","name":"Boa Vista Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Boa_Vista_International_Airport","comments":null,"name_en":"Boa Vista International Airport"},"geometry":{"type":"Point","coordinates":[-60.692220633868232,2.84119534121157]}},{"type":"Feature","properties":{"type":"major","name":"Gran Canaria","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gran_Canaria_Airport","comments":null,"name_en":"Gran Canaria Airport"},"geometry":{"type":"Point","coordinates":[-15.389924515846113,27.936889971657408]}},{"type":"Feature","properties":{"type":"mid","name":"Com. Armando Tola Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Comandante_Armando_Tola_International_Airport","comments":"ok","name_en":"Comandante Armando Tola International Airport"},"geometry":{"type":"Point","coordinates":[-72.053856910129625,-50.283900869003766]}},{"type":"Feature","properties":{"type":"mid","name":"Stockholm-Skavsta","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Stockholm-Skavsta_Airport","comments":null,"name_en":"Stockholm Skavsta Airport"},"geometry":{"type":"Point","coordinates":[16.921605558425419,58.785104130344784]}},{"type":"Feature","properties":{"type":"mid","name":"Polonia Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Polonia_International_Airport","comments":null,"name_en":"Soewondo Air Force Base"},"geometry":{"type":"Point","coordinates":[98.676192571464071,3.56659179990894]}},{"type":"Feature","properties":{"type":"mid","name":"Bangui M'Poko Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bangui_M'Poko_International_Airport","comments":null,"name_en":"Bangui M'Poko International Airport"},"geometry":{"type":"Point","coordinates":[18.524123630208024,4.398851536959572]}},{"type":"Feature","properties":{"type":"major","name":"Hangzhou Xiaoshan Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hangzhou_Xiaoshan_International_Airport","comments":"ok","name_en":"Hangzhou Xiaoshan International Airport"},"geometry":{"type":"Point","coordinates":[120.432097376312939,30.235186279041436]}},{"type":"Feature","properties":{"type":"mid","name":"Cassidy Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Cassidy_International_Airport","comments":null,"name_en":"Cassidy International Airport"},"geometry":{"type":"Point","coordinates":[-157.349777893430371,1.986161197924021]}},{"type":"Feature","properties":{"type":"mid","name":"Šiauliai Int'l","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/%C5%A0iauliai_International_Airport","comments":null,"name_en":"Šiauliai International Airport"},"geometry":{"type":"Point","coordinates":[23.383188573869113,55.903769454039988]}},{"type":"Feature","properties":{"type":"mid","name":"Niue Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Niue_International_Airport","comments":null,"name_en":"Niue International Airport"},"geometry":{"type":"Point","coordinates":[-169.926129774216719,-19.076712935451056]}},{"type":"Feature","properties":{"type":"mid","name":"Guaraní Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Guarani_International_Airport","comments":null,"name_en":"Guaraní International Airport"},"geometry":{"type":"Point","coordinates":[-54.839399529606212,-25.456857071581247]}},{"type":"Feature","properties":{"type":"mid","name":"Rodríguez Ballón Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Rodriguez_Ballon_International_Airport","comments":null,"name_en":"Rodríguez Ballón International Airport"},"geometry":{"type":"Point","coordinates":[-71.567933538528521,-16.344552065351998]}},{"type":"Feature","properties":{"type":"mid and military","name":"Vladivostok Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Vladivostok_International_Airport","comments":null,"name_en":"Vladivostok International Airport"},"geometry":{"type":"Point","coordinates":[132.139841720714685,43.377649253388505]}},{"type":"Feature","properties":{"type":"major","name":"Pristina","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Pristina_International_Airport_Adem_Jashari","comments":null,"name_en":"Pristina International Airport Adem Jashari"},"geometry":{"type":"Point","coordinates":[21.030269012474591,42.585033115344828]}},{"type":"Feature","properties":{"type":"mid","name":"Deurne","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Antwerp_International_Airport","comments":null,"name_en":"Antwerp International Airport"},"geometry":{"type":"Point","coordinates":[4.450922773999088,51.189128506380641]}},{"type":"Feature","properties":{"type":"mid","name":"Gen. Márquez de León Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Manuel_M%C3%A1rquez_de_Le%C3%B3n_International_Airport","comments":null,"name_en":"Manuel Márquez de León International Airport"},"geometry":{"type":"Point","coordinates":[-110.367197859809465,24.076090352180334]}},{"type":"Feature","properties":{"type":"major","name":"Harbin Taiping","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Harbin_Taiping_International_Airport","comments":null,"name_en":"Harbin Taiping International Airport"},"geometry":{"type":"Point","coordinates":[126.236983030862703,45.62060117232452]}},{"type":"Feature","properties":{"type":"mid","name":"Trivandrum Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Trivandrum_International_Airport","comments":null,"name_en":"Trivandrum International Airport"},"geometry":{"type":"Point","coordinates":[76.918902561291318,8.476509938945144]}},{"type":"Feature","properties":{"type":"major","name":"Adnan Menderes","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Adnan_Menderes_Airport","comments":null,"name_en":"İzmir Adnan Menderes Airport"},"geometry":{"type":"Point","coordinates":[27.149297595266408,38.291234764517462]}},{"type":"Feature","properties":{"type":"major","name":"Nanjing Lukou Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nanjing_Lukou_International_Airport","comments":null,"name_en":"Nanjing Lukou International Airport"},"geometry":{"type":"Point","coordinates":[118.866102146905916,31.735324929617661]}},{"type":"Feature","properties":{"type":"mid","name":"Freeport Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Grand_Bahama_International_Airport","comments":null,"name_en":"Grand Bahama International Airport"},"geometry":{"type":"Point","coordinates":[-78.703934311449672,26.548246747188983]}},{"type":"Feature","properties":{"type":"major","name":"Tripoli Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tripoli_International_Airport","comments":null,"name_en":"Tripoli International Airport"},"geometry":{"type":"Point","coordinates":[13.144258981071262,32.669169550499333]}},{"type":"Feature","properties":{"type":"mid","name":"Gander Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gander_International_Airport","comments":null,"name_en":"Gander International Airport"},"geometry":{"type":"Point","coordinates":[-54.575571909357812,48.946598006073565]}},{"type":"Feature","properties":{"type":"major and military","name":"Doha Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Doha_International_Airport","comments":null,"name_en":"Doha International Airport"},"geometry":{"type":"Point","coordinates":[51.558548787654715,25.268246131050645]}},{"type":"Feature","properties":{"type":"major","name":"Albuquerque Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Albuquerque_International_Sunport","comments":null,"name_en":"Albuquerque International Sunport"},"geometry":{"type":"Point","coordinates":[-106.616685161600202,35.049157801827647]}},{"type":"Feature","properties":{"type":"mid","name":"V.C. Bird Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/VC_Bird_International_Airport","comments":null,"name_en":"V. C. Bird International Airport"},"geometry":{"type":"Point","coordinates":[-61.792367669835826,17.140359937161683]}},{"type":"Feature","properties":{"type":"mid","name":"Faleolo","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Faleolo_International_Airport","comments":null,"name_en":"Faleolo International Airport"},"geometry":{"type":"Point","coordinates":[-171.997322218339832,-13.832501332395603]}},{"type":"Feature","properties":{"type":"mid","name":"Asyut","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Assiut_Airport","comments":null,"name_en":"Assiut Airport"},"geometry":{"type":"Point","coordinates":[31.016249043801107,27.050815840697808]}},{"type":"Feature","properties":{"type":"major","name":"Bahrain Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bahrain_International_Airport","comments":null,"name_en":"Bahrain International Airport"},"geometry":{"type":"Point","coordinates":[50.626002875753358,26.269697149949714]}},{"type":"Feature","properties":{"type":"major","name":"Bradley Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bradley_International_Airport","comments":null,"name_en":"Bradley International Airport"},"geometry":{"type":"Point","coordinates":[-72.685394743339032,41.930316005835181]}},{"type":"Feature","properties":{"type":"mid","name":"Grantley Adams Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Grantley_Adams_International_Airport","comments":null,"name_en":"Grantley Adams International Airport"},"geometry":{"type":"Point","coordinates":[-59.487418895315848,13.079661104553033]}},{"type":"Feature","properties":{"type":"mid","name":"Yundum Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Banjul_International_Airport","comments":null,"name_en":"Banjul International Airport"},"geometry":{"type":"Point","coordinates":[-16.652313269807472,13.343860478894186]}},{"type":"Feature","properties":{"type":"mid","name":"Bujumbura Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bujumbura_International_Airport","comments":null,"name_en":"Bujumbura International Airport"},"geometry":{"type":"Point","coordinates":[29.320984016993869,-3.322044349131131]}},{"type":"Feature","properties":{"type":"mid","name":"Chileka Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chileka_International_Airport","comments":null,"name_en":"Chileka International Airport"},"geometry":{"type":"Point","coordinates":[34.971944183793276,-15.681384479327249]}},{"type":"Feature","properties":{"type":"mid","name":"Broome Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Broome_International_Airport","comments":null,"name_en":"Broome International Airport"},"geometry":{"type":"Point","coordinates":[122.233850515021842,-17.95257612926801]}},{"type":"Feature","properties":{"type":"mid","name":"Bandar Abbass Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bandar_Abbas_International_Airport","comments":null,"name_en":"Bandar Abbas International Airport"},"geometry":{"type":"Point","coordinates":[56.368886456410998,27.210325845514543]}},{"type":"Feature","properties":{"type":"major","name":"Basrah Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Basra_International_Airport","comments":null,"name_en":"Basra International Airport"},"geometry":{"type":"Point","coordinates":[47.668376663351836,30.552799016106043]}},{"type":"Feature","properties":{"type":"mid","name":"Ciudad Juarez Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Abraham_Gonz%C3%A1lez_International_Airport","comments":null,"name_en":"Abraham González Airport"},"geometry":{"type":"Point","coordinates":[-106.435846631055398,31.635756620195146]}},{"type":"Feature","properties":{"type":"major","name":"Katunayake Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bandaranaike_International_Airport","comments":null,"name_en":"Bandaranaike International Airport"},"geometry":{"type":"Point","coordinates":[79.885257342150624,7.178077105442211]}},{"type":"Feature","properties":{"type":"mid","name":"Cairns Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cairns_International_Airport","comments":null,"name_en":"Cairns Airport"},"geometry":{"type":"Point","coordinates":[145.753584844399768,-16.876742155406177]}},{"type":"Feature","properties":{"type":"major","name":"Chiang Mai Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chiang_Mai_International_Airport","comments":null,"name_en":"Chiang Mai International Airport"},"geometry":{"type":"Point","coordinates":[98.968118124159332,18.768847391967526]}},{"type":"Feature","properties":{"type":"major","name":"City of Colorado Springs","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Colorado_Springs_Airport","comments":null,"name_en":"Colorado Springs Airport"},"geometry":{"type":"Point","coordinates":[-104.700880274111341,38.797424877912519]}},{"type":"Feature","properties":{"type":"mid","name":"Ign. Alberto Ongay Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ing._Alberto_Acu%C3%B1a_Ongay_International_Airport","comments":null,"name_en":"Ing. Alberto Acuña Ongay International Airport"},"geometry":{"type":"Point","coordinates":[-90.503628373403842,19.814224799207441]}},{"type":"Feature","properties":{"type":"major","name":"Changsha Huanghua Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Changsha_airport","comments":null,"name_en":"Changsha Huanghua International Airport"},"geometry":{"type":"Point","coordinates":[113.214054203252047,28.189921861945066]}},{"type":"Feature","properties":{"type":"major","name":"Greater Cincinnati Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cincinnati/Northern_Kentucky_International_Airport","comments":null,"name_en":"Cincinnati/Northern Kentucky International Airport"},"geometry":{"type":"Point","coordinates":[-84.656169915339191,39.055418904783039]}},{"type":"Feature","properties":{"type":"major","name":"Da Nang","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Da_Nang_International_Airport","comments":null,"name_en":"Da Nang International Airport"},"geometry":{"type":"Point","coordinates":[108.202706257935688,16.053144145166961]}},{"type":"Feature","properties":{"type":"major","name":"Dallas Love Field","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dallas_Love_Field","comments":null,"name_en":"Dallas Love Field"},"geometry":{"type":"Point","coordinates":[-96.849863770979951,32.844425373273843]}},{"type":"Feature","properties":{"type":"major","name":"Damascus Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Damascus_International_Airport","comments":null,"name_en":"Damascus International Airport"},"geometry":{"type":"Point","coordinates":[36.51289547181257,33.41143667027319]}},{"type":"Feature","properties":{"type":"mid","name":"Enrique Malek Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Enrique_Malek_International_Airport","comments":null,"name_en":"Enrique Malek International Airport"},"geometry":{"type":"Point","coordinates":[-82.431758336938657,8.391261061169175]}},{"type":"Feature","properties":{"type":"mid","name":"Aba Tenna D. Yilma Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Aba_Tenna_Dejazmach_Yilma_International_Airport","comments":null,"name_en":"Aba Tenna Dejazmach Yilma International Airport"},"geometry":{"type":"Point","coordinates":[41.857756722253001,9.612677847535689]}},{"type":"Feature","properties":{"type":"major","name":"Bali Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ngurah_Rai_Airport","comments":null,"name_en":"Ngurah Rai International Airport"},"geometry":{"type":"Point","coordinates":[115.162322961106611,-8.744757315956518]}},{"type":"Feature","properties":{"type":"major","name":"Des Moines Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Des_Moines_International_Airport","comments":null,"name_en":"Des Moines International Airport"},"geometry":{"type":"Point","coordinates":[-93.648461256373622,41.532790424211299]}},{"type":"Feature","properties":{"type":"mid","name":"Entebbe Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Entebbe_International_Airport","comments":null,"name_en":"Entebbe International Airport"},"geometry":{"type":"Point","coordinates":[32.442757313521398,0.044940949388672]}},{"type":"Feature","properties":{"type":"mid","name":"Kisangani Bangoka Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bangoka_International_Airport","comments":null,"name_en":"Bangoka International Airport"},"geometry":{"type":"Point","coordinates":[25.330271489621154,0.492225136917501]}},{"type":"Feature","properties":{"type":"mid","name":"Fuzhou Changle Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Fuzhou_Changle_International_Airport","comments":null,"name_en":"Fuzhou Changle International Airport"},"geometry":{"type":"Point","coordinates":[119.668043820999202,25.931823314814313]}},{"type":"Feature","properties":{"type":"mid","name":"Lokpriya G. Bordoloi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lokpriya_Gopinath_Bordoloi_International_Airport","comments":null,"name_en":"Lokpriya Gopinath Bordoloi International Airport"},"geometry":{"type":"Point","coordinates":[91.588229058186968,26.105247592425503]}},{"type":"Feature","properties":{"type":"major","name":"Gdansk Lech Walesa","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gda%C5%84sk_Lech_Wa%C5%82%C4%99sa_Airport","comments":null,"name_en":"Gdańsk Lech Wałęsa Airport"},"geometry":{"type":"Point","coordinates":[18.468442216591136,54.380702535292464]}},{"type":"Feature","properties":{"type":"mid","name":"Point Salines Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Point_Salines_International_Airport","comments":null,"name_en":"Maurice Bishop International Airport"},"geometry":{"type":"Point","coordinates":[-61.78585299092849,12.007268305428271]}},{"type":"Feature","properties":{"type":"mid","name":"Nizhny Novgorod Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nizhny_Novgorod_International_Airport","comments":null,"name_en":"Nizhny Novgorod International Airport"},"geometry":{"type":"Point","coordinates":[43.789633706293515,56.21855259106556]}},{"type":"Feature","properties":{"type":"mid","name":"Gen. José M. Yáñez Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Jos%C3%A9_Mar%C3%ADa_Y%C3%A1%C3%B1ez_International_Airport","comments":null,"name_en":"General José María Yáñez International Airport"},"geometry":{"type":"Point","coordinates":[-110.921651270402194,27.969455396282893]}},{"type":"Feature","properties":{"type":"mid","name":"Hohhot Baita Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hohhot_Baita_International_Airport","comments":null,"name_en":"Hohhot Baita International Airport"},"geometry":{"type":"Point","coordinates":[111.814681821625911,40.854060090655217]}},{"type":"Feature","properties":{"type":"mid","name":"Helena Reg.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Helena_Regional_Airport","comments":null,"name_en":"Helena Regional Airport"},"geometry":{"type":"Point","coordinates":[-111.989896896007593,46.610204352899963]}},{"type":"Feature","properties":{"type":"mid","name":"Gen. Ignacio P. Garcia Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Ignacio_Pesqueira_Garcia_International_Airport","comments":null,"name_en":"General Ignacio Pesqueira García International Airport"},"geometry":{"type":"Point","coordinates":[-111.051901711819099,29.090077252344535]}},{"type":"Feature","properties":{"type":"major","name":"Dulles Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Washington_Dulles_International_Airport","comments":null,"name_en":"Washington Dulles International Airport"},"geometry":{"type":"Point","coordinates":[-77.447792576920619,38.95277403795302]}},{"type":"Feature","properties":{"type":"mid","name":"Hilo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hilo_International_Airport","comments":null,"name_en":"Hilo International Airport"},"geometry":{"type":"Point","coordinates":[-155.039629733434907,19.714797686866262]}},{"type":"Feature","properties":{"type":"major","name":"Jackson Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jackson-Evers_International_Airport","comments":null,"name_en":"Jackson-Evers International Airport"},"geometry":{"type":"Point","coordinates":[-90.075098627692384,32.310060027363512]}},{"type":"Feature","properties":{"type":"major","name":"Jacksonville Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jacksonville_International_Airport","comments":null,"name_en":"Jacksonville International Airport"},"geometry":{"type":"Point","coordinates":[-81.683576727831124,30.491352730947966]}},{"type":"Feature","properties":{"type":"mid","name":"Kuching Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kuching_International_Airport","comments":null,"name_en":"Kuching International Airport"},"geometry":{"type":"Point","coordinates":[110.341837054315306,1.487207937790097]}},{"type":"Feature","properties":{"type":"mid","name":"Kigali Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kigali_International_Airport","comments":null,"name_en":"Kigali International Airport"},"geometry":{"type":"Point","coordinates":[30.13487681878561,-1.96365443664138]}},{"type":"Feature","properties":{"type":"major","name":"Kraków-Balice","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/John_Paul_II_International_Airport_Krak%C3%B3w-Balice","comments":"fixed name","name_en":"John Paul II International Airport Kraków-Balice"},"geometry":{"type":"Point","coordinates":[19.800977284450408,50.072263064833137]}},{"type":"Feature","properties":{"type":"major","name":"Kurumoch","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kurumoch_International_Airport","comments":null,"name_en":"Kurumoch International Airport"},"geometry":{"type":"Point","coordinates":[50.147265521019051,53.508384819093529]}},{"type":"Feature","properties":{"type":"major","name":"Guilin Liangjiang Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Guilin_Liangjiang_International_Airport","comments":null,"name_en":"Guilin Liangjiang International Airport"},"geometry":{"type":"Point","coordinates":[110.046893497770085,25.217605525229324]}},{"type":"Feature","properties":{"type":"mid","name":"Laoag Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Laoag_International_Airport","comments":null,"name_en":"Laoag International Airport"},"geometry":{"type":"Point","coordinates":[120.533876196127011,18.182418086637874]}},{"type":"Feature","properties":{"type":"major","name":"LaGuardia","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/LaGuardia_Airport","comments":null,"name_en":"LaGuardia Airport"},"geometry":{"type":"Point","coordinates":[-73.871985820481399,40.774553939885763]}},{"type":"Feature","properties":{"type":"major","name":"London Gatwick","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/London_Gatwick_Airport","comments":null,"name_en":"Gatwick Airport"},"geometry":{"type":"Point","coordinates":[-0.162961639139456,51.155756751927456]}},{"type":"Feature","properties":{"type":"major","name":"Ljubljana","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ljubljana_Jo%C5%BEe_Pu%C4%8Dnik_Airport","comments":null,"name_en":"Ljubljana Jože Pučnik Airport"},"geometry":{"type":"Point","coordinates":[14.454812628326566,46.230544555448624]}},{"type":"Feature","properties":{"type":"mid","name":"Amausi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Amausi_Airport","comments":null,"name_en":"Chaudhary Charan Singh Airport"},"geometry":{"type":"Point","coordinates":[80.88417197324722,26.763932870091633]}},{"type":"Feature","properties":{"type":"mid","name":"La Plata","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/La_Plata_Airport","comments":null,"name_en":"La Plata Airport"},"geometry":{"type":"Point","coordinates":[-57.895382063651013,-34.965544155923403]}},{"type":"Feature","properties":{"type":"mid","name":"Gen. Sevando Canales","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Servando_Canales_International_Airport","comments":null,"name_en":"General Servando Canales International Airport"},"geometry":{"type":"Point","coordinates":[-97.530821712118708,25.770841264061858]}},{"type":"Feature","properties":{"type":"major","name":"Manchester Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Manchester_Airport","comments":null,"name_en":"Manchester Airport"},"geometry":{"type":"Point","coordinates":[-2.273371590694274,53.362489606651813]}},{"type":"Feature","properties":{"type":"major","name":"Kansas City Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kansas_City_International_Airport","comments":null,"name_en":"Kansas City International Airport"},"geometry":{"type":"Point","coordinates":[-94.715914857915436,39.297895826365945]}},{"type":"Feature","properties":{"type":"major","name":"Seeb Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Seeb_International_Airport","comments":null,"name_en":"Muscat International Airport"},"geometry":{"type":"Point","coordinates":[58.290480475349298,23.588570417585636]}},{"type":"Feature","properties":{"type":"mid","name":"Habib Bourguiba Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Habib_Bourguiba_International_Airport","comments":null,"name_en":"Monastir Habib Bourguiba International Airport"},"geometry":{"type":"Point","coordinates":[10.75336818505404,35.760710442178031]}},{"type":"Feature","properties":{"type":"major","name":"Marseille Provence Airport","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Marseille_Provence_Airport","comments":null,"name_en":"Marseille Provence Airport"},"geometry":{"type":"Point","coordinates":[5.221379177203373,43.44106000164679]}},{"type":"Feature","properties":{"type":"mid","name":"Quetzalcoatl Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Quetzalc%C3%B3atl_International_Airport","comments":null,"name_en":"Quetzalcóatl International Airport"},"geometry":{"type":"Point","coordinates":[-99.568008193006307,27.449689650831623]}},{"type":"Feature","properties":{"type":"major","name":"Nanning Wuwu Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nanning_Wuxu_International_Airport","comments":null,"name_en":"Nanning Wuxu International Airport"},"geometry":{"type":"Point","coordinates":[108.168012273330959,22.612037054178508]}},{"type":"Feature","properties":{"type":"mid","name":"Xoxocotlán Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Xoxocotl%C3%A1n_International_Airport","comments":null,"name_en":"Xoxocotlán International Airport"},"geometry":{"type":"Point","coordinates":[-96.721795938497536,17.000559256974505]}},{"type":"Feature","properties":{"type":"mid","name":"Kahului","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kahului_Airport","comments":null,"name_en":"Kahului Airport"},"geometry":{"type":"Point","coordinates":[-156.437429581353399,20.89328851511117]}},{"type":"Feature","properties":{"type":"major","name":"Will Rogers","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Will_Rogers_World_Airport","comments":null,"name_en":"Will Rogers World Airport"},"geometry":{"type":"Point","coordinates":[-97.596117754209217,35.395277491174419]}},{"type":"Feature","properties":{"type":"major","name":"Norfolk Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Norfolk_International_Airport","comments":null,"name_en":"Norfolk International Airport"},"geometry":{"type":"Point","coordinates":[-76.204423171232705,36.898239467367418]}},{"type":"Feature","properties":{"type":"major","name":"Palm Beach Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Palm_Beach_International_Airport","comments":null,"name_en":"Palm Beach International Airport"},"geometry":{"type":"Point","coordinates":[-80.090189338338732,26.688441666432965]}},{"type":"Feature","properties":{"type":"mid","name":"Pengel Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Johan_Adolf_Pengel_International_Airport","comments":null,"name_en":"Johan Adolf Pengel International Airport"},"geometry":{"type":"Point","coordinates":[-55.199911389290236,5.455999677974393]}},{"type":"Feature","properties":{"type":"mid","name":"Bolshesavino","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bolshoye_Savino_Airport","comments":null,"name_en":"Bolshoye Savino Airport"},"geometry":{"type":"Point","coordinates":[56.019560282029694,57.919771123169134]}},{"type":"Feature","properties":{"type":"mid","name":"Penang Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Penang_International_Airport","comments":null,"name_en":"Penang International Airport"},"geometry":{"type":"Point","coordinates":[100.265786380954765,5.292656277904887]}},{"type":"Feature","properties":{"type":"mid","name":"Port Harcourt Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Port_Harcourt_International_Airport","comments":null,"name_en":"Port Harcourt International Airport"},"geometry":{"type":"Point","coordinates":[6.949897427231909,5.007003476739435]}},{"type":"Feature","properties":{"type":"mid","name":"Port Hedland Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Port_Hedland_International_Airport","comments":null,"name_en":"Port Hedland International Airport"},"geometry":{"type":"Point","coordinates":[118.631797815615286,-20.378127296072336]}},{"type":"Feature","properties":{"type":"mid","name":"Pierre Regional","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Pierre_Regional_Airport","comments":null,"name_en":"Pierre Regional Airport"},"geometry":{"type":"Point","coordinates":[-100.292641981705316,44.380153466876223]}},{"type":"Feature","properties":{"type":"major","name":"Greater Pittsburgh Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Pittsburgh_International_Airport","comments":null,"name_en":"Pittsburgh International Airport"},"geometry":{"type":"Point","coordinates":[-80.256129057191799,40.496051891528495]}},{"type":"Feature","properties":{"type":"mid","name":"Pago Pago Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Pago_Pago_International_Airport","comments":null,"name_en":"Pago Pago International Airport"},"geometry":{"type":"Point","coordinates":[-170.713307053734439,-14.329064185030566]}},{"type":"Feature","properties":{"type":"major","name":"Birmingham Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Birmingham_International_Airport_(United_Kingdom)","comments":null,"name_en":"Birmingham Airport"},"geometry":{"type":"Point","coordinates":[-1.733731704344524,52.452908554283809]}},{"type":"Feature","properties":{"type":"mid","name":"Roberts Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Roberts_International_Airport","comments":null,"name_en":"Roberts International Airport"},"geometry":{"type":"Point","coordinates":[-10.353085186793352,6.241834565545255]}},{"type":"Feature","properties":{"type":"mid","name":"Raipur","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Raipur_Airport","comments":null,"name_en":"Swami Vivekananda Airport"},"geometry":{"type":"Point","coordinates":[81.740377591520144,21.185986856144691]}},{"type":"Feature","properties":{"type":"mid","name":"El Salvador Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cuscatlan_International_Airport","comments":"???","name_en":"Monseñor Óscar Arnulfo Romero International Airport"},"geometry":{"type":"Point","coordinates":[-89.057203569274293,13.444748122861604]}},{"type":"Feature","properties":{"type":"major","name":"San Diego Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/San_Diego_International_Airport","comments":null,"name_en":"San Diego International Airport"},"geometry":{"type":"Point","coordinates":[-117.197511025731032,32.732264557013188]}},{"type":"Feature","properties":{"type":"major","name":"San Antonio Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/San_Antonio_International_Airport","comments":null,"name_en":"San Antonio International Airport"},"geometry":{"type":"Point","coordinates":[-98.471969999155903,29.526620339131505]}},{"type":"Feature","properties":{"type":"major","name":"Savannah Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Savannah/Hilton_Head_International_Airport","comments":null,"name_en":"Savannah/Hilton Head International Airport"},"geometry":{"type":"Point","coordinates":[-81.209964775091336,32.13564155229021]}},{"type":"Feature","properties":{"type":"mid","name":"Antonio Maceo","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Antonio_Maceo_Airport","comments":null,"name_en":"Antonio Maceo Airport"},"geometry":{"type":"Point","coordinates":[-75.839887763979092,19.972428871762215]}},{"type":"Feature","properties":{"type":"mid","name":"Ponciano Arriaga Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ponciano_Arriaga_International_Airport","comments":null,"name_en":"San Luis Potosí International Airport"},"geometry":{"type":"Point","coordinates":[-100.936477816266972,22.255713049590337]}},{"type":"Feature","properties":{"type":"major","name":"Sacramento Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sacramento_International_Airport","comments":null,"name_en":"Sacramento International Airport"},"geometry":{"type":"Point","coordinates":[-121.587894877722775,38.692723892555399]}},{"type":"Feature","properties":{"type":"mid","name":"Cibao Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cibao_International_Airport","comments":null,"name_en":"Cibao International Airport"},"geometry":{"type":"Point","coordinates":[-70.69417832244676,19.465921915288838]}},{"type":"Feature","properties":{"type":"major","name":"Koltsovo","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Koltsovo_Airport","comments":null,"name_en":"Koltsovo Airport"},"geometry":{"type":"Point","coordinates":[60.805803343217377,56.732245612045972]}},{"type":"Feature","properties":{"type":"major","name":"Syracuse Hancock Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Syracuse_Hancock_International_Airport","comments":null,"name_en":"Syracuse Hancock International Airport"},"geometry":{"type":"Point","coordinates":[-76.1130789991049,43.131784494374131]}},{"type":"Feature","properties":{"type":"mid","name":"Tabriz","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tabriz_International_Airport","comments":null,"name_en":"Tabriz International Airport"},"geometry":{"type":"Point","coordinates":[46.244713373574001,38.131110768817514]}},{"type":"Feature","properties":{"type":"mid","name":"Torreon Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Francisco_Sarabia_International_Airport","comments":null,"name_en":"Francisco Sarabia International Airport"},"geometry":{"type":"Point","coordinates":[-103.398787828578875,25.563216439989581]}},{"type":"Feature","properties":{"type":"major","name":"Tulsa Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tulsa_International_Airport","comments":null,"name_en":"Tulsa International Airport"},"geometry":{"type":"Point","coordinates":[-95.889882271542021,36.190127565194992]}},{"type":"Feature","properties":{"type":"major","name":"Mcghee Tyson","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/McGhee_Tyson_Airport","comments":null,"name_en":"McGhee Tyson Airport"},"geometry":{"type":"Point","coordinates":[-83.989937832758457,35.80574480270883]}},{"type":"Feature","properties":{"type":"major","name":"Ufa Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ufa_International_Airport","comments":null,"name_en":"Ufa International Airport"},"geometry":{"type":"Point","coordinates":[55.884077341183726,54.565132357897177]}},{"type":"Feature","properties":{"type":"mid","name":"Hewanorra Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hewanorra_International_Airport","comments":null,"name_en":"Hewanorra International Airport"},"geometry":{"type":"Point","coordinates":[-60.949973772346056,13.736523805048892]}},{"type":"Feature","properties":{"type":"mid","name":"Windhoek Hosea Kutako Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Windhoek_Hosea_Kutako_International_Airport","comments":null,"name_en":"Windhoek Hosea Kutako International Airport"},"geometry":{"type":"Point","coordinates":[17.463225902813253,-22.486953120204117]}},{"type":"Feature","properties":{"type":"mid","name":"Sault Ste Marie","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sault_Ste._Marie_Airport","comments":null,"name_en":"Sault Ste. Marie Airport"},"geometry":{"type":"Point","coordinates":[-84.500608999971746,46.485417510192555]}},{"type":"Feature","properties":{"type":"mid","name":"Dawson Cr.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dawson_Creek_Airport","comments":null,"name_en":"Dawson Creek Airport"},"geometry":{"type":"Point","coordinates":[-120.18559561910142,55.739411707455702]}},{"type":"Feature","properties":{"type":"major","name":"Edmonton Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Edmonton_International_Airport","comments":null,"name_en":"Edmonton International Airport"},"geometry":{"type":"Point","coordinates":[-113.584492564405593,53.307200161918324]}},{"type":"Feature","properties":{"type":"major","name":"Halifax Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Halifax_International_Airport","comments":null,"name_en":"Halifax Stanfield International Airport"},"geometry":{"type":"Point","coordinates":[-63.514965250167336,44.886545450100954]}},{"type":"Feature","properties":{"type":"mid","name":"Kamloops","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kamloops_Airport","comments":null,"name_en":"Kamloops Airport"},"geometry":{"type":"Point","coordinates":[-120.441734763962316,50.705195518459128]}},{"type":"Feature","properties":{"type":"mid","name":"Sudbury","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sudbury_Airport","comments":null,"name_en":"Sudbury Airport"},"geometry":{"type":"Point","coordinates":[-80.79577478171052,46.622750820489316]}},{"type":"Feature","properties":{"type":"mid","name":"Saint John","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Saint_John_Airport","comments":null,"name_en":"Saint John Airport"},"geometry":{"type":"Point","coordinates":[-65.890557368116774,45.329230595501656]}},{"type":"Feature","properties":{"type":"mid","name":"Prince George","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Prince_George_Airport","comments":null,"name_en":"Prince George Airport"},"geometry":{"type":"Point","coordinates":[-122.674014743986163,53.884248575113766]}},{"type":"Feature","properties":{"type":"major","name":"Victoria Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Victoria_International_Airport","comments":null,"name_en":"Victoria International Airport"},"geometry":{"type":"Point","coordinates":[-123.430624539527741,48.640529482179019]}},{"type":"Feature","properties":{"type":"mid","name":"Zamboanga Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Zamboanga_International_Airport","comments":null,"name_en":"Zamboanga International Airport"},"geometry":{"type":"Point","coordinates":[122.062432321637317,6.919757748058303]}},{"type":"Feature","properties":{"type":"mid","name":"Lanzhou Zhongchuan","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lanzhou_Zhongchuan_Airport","comments":null,"name_en":"Lanzhou Zhongchuan International Airport"},"geometry":{"type":"Point","coordinates":[103.615415363043311,36.507884246123673]}},{"type":"Feature","properties":{"type":"mid","name":"Albany Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Albany_International_Airport","comments":null,"name_en":"Albany International Airport"},"geometry":{"type":"Point","coordinates":[-73.809351884317252,42.745661980172905]}},{"type":"Feature","properties":{"type":"major","name":"General Mitchell Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Mitchell_International_Airport","comments":null,"name_en":"Milwaukee Mitchell International Airport"},"geometry":{"type":"Point","coordinates":[-87.902105625074384,42.947919872958551]}},{"type":"Feature","properties":{"type":"military mid","name":"Wang-Chia Tun Airbase","location":"runway","wikipedia":null,"comments":"\"ToreplacetheoldWangjiadunAirport,ChinesegovernmentpermittedtheplantobuildacommercialairportinTianheCounty,HuangpiDistrict,WuhanatJuly1st,1985.ThefirsttermconstructionstartedinDecember1989andfinishedinApril1994.Itf", "name_en": "WuhanTianheInternationalAirport" }, "geometry": { "type": "Point", "coordinates": [ 114.246947376150445, 30.60171411967017 ] } },{"type":"Feature","properties":{"type":"major","name":"Sanya Phoenix Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sanya_Phoenix_International_Airport","comments":null,"name_en":"Sanya Phoenix International Airport"},"geometry":{"type":"Point","coordinates":[109.40823949107957,18.309095990859316]}},{"type":"Feature","properties":{"type":"mid","name":"Lhasa Gonggar","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lhasa_Gonggar_Airport","comments":null,"name_en":"Lhasa Gonggar Airport"},"geometry":{"type":"Point","coordinates":[90.900561019402701,29.293693612318421]}},{"type":"Feature","properties":{"type":"mid","name":"Hotan","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hotan_Airport","comments":null,"name_en":"Hotan Airport"},"geometry":{"type":"Point","coordinates":[79.872300521219145,37.040036350976521]}},{"type":"Feature","properties":{"type":"major","name":"Dresden","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dresden_Airport","comments":null,"name_en":"Dresden Airport"},"geometry":{"type":"Point","coordinates":[13.764967144004661,51.125091242887116]}},{"type":"Feature","properties":{"type":"military major","name":"Kenitra Air Base","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kenitra_Air_Base","comments":null,"name_en":"Kenitra Air Base"},"geometry":{"type":"Point","coordinates":[-6.597753628115997,34.298667363822325]}},{"type":"Feature","properties":{"type":"mid","name":"Annemasse","location":"ramp","wikipedia":"http://en.wikipedia.org/wiki/Annemasse_Aerodrome","comments":null,"name_en":"Annemasse Aerodrome"},"geometry":{"type":"Point","coordinates":[6.264910853641591,46.19572832862606]}},{"type":"Feature","properties":{"type":"mid","name":"Nogales Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nogales_International_Airport_(Mexico)","comments":null,"name_en":"Nogales International Airport"},"geometry":{"type":"Point","coordinates":[-110.97272130167508,31.225537174115924]}},{"type":"Feature","properties":{"type":"mid","name":"Strasbourg","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Strasbourg_Airport","comments":null,"name_en":"Strasbourg Airport"},"geometry":{"type":"Point","coordinates":[7.627841966889242,48.544696172175939]}},{"type":"Feature","properties":{"type":"major","name":"Cologne/Bonn","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cologne_Bonn_Airport","comments":null,"name_en":"Cologne Bonn Airport"},"geometry":{"type":"Point","coordinates":[7.122359755245386,50.878259662947087]}},{"type":"Feature","properties":{"type":"major","name":"Kimhae Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gimhae_International_Airport","comments":null,"name_en":"Gimhae International Airport"},"geometry":{"type":"Point","coordinates":[128.948801379038798,35.170284063682949]}},{"type":"Feature","properties":{"type":"major","name":"Jeju Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jeju_International_Airport","comments":null,"name_en":"Jeju International Airport"},"geometry":{"type":"Point","coordinates":[126.491629401972418,33.524717315039879]}},{"type":"Feature","properties":{"type":"major","name":"Stavanger Sola","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Stavanger_Airport,_Sola","comments":null,"name_en":"Stavanger Airport"},"geometry":{"type":"Point","coordinates":[5.629810329721799,58.882156484218477]}},{"type":"Feature","properties":{"type":"major","name":"Trondheim Vaernes","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Trondheim_Airport%2C_V%C3%A6rnes","comments":null,"name_en":"Trondheim Airport"},"geometry":{"type":"Point","coordinates":[10.916809524144515,63.472029381716986]}},{"type":"Feature","properties":{"type":"mid","name":"Corumbá Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Corumba_International_Airport","comments":null,"name_en":"Corumbá International Airport"},"geometry":{"type":"Point","coordinates":[-57.663607892554346,-19.014166288553351]}},{"type":"Feature","properties":{"type":"mid","name":"Madeira","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Madeira_Airport","comments":null,"name_en":"Madeira Airport"},"geometry":{"type":"Point","coordinates":[-16.775637453121334,32.693364284748867]}},{"type":"Feature","properties":{"type":"mid","name":"Foz do Iguaçu Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Foz_do_Igua%C3%A7u_International_Airport","comments":null,"name_en":"Foz do Iguaçu International Airport"},"geometry":{"type":"Point","coordinates":[-54.48859227356332,-25.597683216210232]}},{"type":"Feature","properties":{"type":"mid","name":"Gov. Jorge Teixeira de Oliveira Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Governador_Jorge_Teixeira_de_Oliveira_International_Airport","comments":null,"name_en":"Governador Jorge Teixeira de Oliveira International Airport"},"geometry":{"type":"Point","coordinates":[-63.898462500421338,-8.714424828592882]}},{"type":"Feature","properties":{"type":"mid","name":"Bilbao","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bilbao_Airport","comments":null,"name_en":"Bilbao Airport"},"geometry":{"type":"Point","coordinates":[-2.906090116798053,43.305082981119469]}},{"type":"Feature","properties":{"type":"major","name":"Palma de Mallorca","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Palma_de_Mallorca_Airport","comments":null,"name_en":"Palma de Mallorca Airport"},"geometry":{"type":"Point","coordinates":[2.729976602006474,39.565775858625408]}},{"type":"Feature","properties":{"type":"major","name":"Tenerife N.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Los_Rodeos_Airport","comments":null,"name_en":"Tenerife North Airport"},"geometry":{"type":"Point","coordinates":[-16.346317567926352,28.487577026773145]}},{"type":"Feature","properties":{"type":"major","name":"Gothenburg","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gothenburg-Landvetter_Airport","comments":null,"name_en":"Gothenburg-Landvetter Airport"},"geometry":{"type":"Point","coordinates":[12.29382690925731,57.685749353487864]}},{"type":"Feature","properties":{"type":"major","name":"Lulea","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lule%C3%A5_Airport","comments":null,"name_en":"Luleå-Kallax Airport"},"geometry":{"type":"Point","coordinates":[22.123027124394543,65.549036247761634]}},{"type":"Feature","properties":{"type":"major","name":"Abu Dhabi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Abu_Dhabi_International_Airport","comments":null,"name_en":"Abu Dhabi International Airport"},"geometry":{"type":"Point","coordinates":[54.646329322555786,24.427227152976421]}},{"type":"Feature","properties":{"type":"mid","name":"Mohamed Boudiaf Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mohamed_Boudiaf_International_Airport","comments":null,"name_en":"Mohamed Boudiaf International Airport"},"geometry":{"type":"Point","coordinates":[6.621946651812188,36.28344094416007]}},{"type":"Feature","properties":{"type":"mid","name":"Aswan Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Aswan_International_Airport","comments":null,"name_en":"Aswan International Airport"},"geometry":{"type":"Point","coordinates":[32.824437246297329,23.968276544177797]}},{"type":"Feature","properties":{"type":"mid","name":"Rovaniemi","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Rovaniemi_Airport","comments":null,"name_en":"Rovaniemi Airport"},"geometry":{"type":"Point","coordinates":[25.829440976045195,66.559556416850938]}},{"type":"Feature","properties":{"type":"mid","name":"Cheddi Jagan Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cheddi_Jagan_International_Airport","comments":null,"name_en":"Cheddi Jagan International Airport"},"geometry":{"type":"Point","coordinates":[-58.25411919258886,6.498552908135722]}},{"type":"Feature","properties":{"type":"major","name":"Cochin Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cochin_International_Airport","comments":null,"name_en":"Cochin International Airport"},"geometry":{"type":"Point","coordinates":[76.390519850202423,10.155118762811767]}},{"type":"Feature","properties":{"type":"mid","name":"Eldoret Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Eldoret_International_Airport","comments":null,"name_en":"Eldoret International Airport"},"geometry":{"type":"Point","coordinates":[35.223693065830126,0.40507147546036]}},{"type":"Feature","properties":{"type":"major","name":"Incheon Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Incheon_International_Airport","comments":null,"name_en":"Incheon International Airport"},"geometry":{"type":"Point","coordinates":[126.450875980795843,37.449208862434624]}},{"type":"Feature","properties":{"type":"mid","name":"Federal de Bachigualato Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Federal_de_Bachigualato_International_Airport","comments":null,"name_en":"Federal de Bachigualato International Airport"},"geometry":{"type":"Point","coordinates":[-107.469863792896177,24.766804039046114]}},{"type":"Feature","properties":{"type":"major and military","name":"Benazir Bhutto Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Islamabad_International_Airport","comments":null,"name_en":"Benazir Bhutto International Airport"},"geometry":{"type":"Point","coordinates":[73.100793647188183,33.607445750752625]}},{"type":"Feature","properties":{"type":"major","name":"Brussels","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Brussels_Airport","comments":null,"name_en":"Brussels Airport"},"geometry":{"type":"Point","coordinates":[4.484640324082722,50.897294964151079]}},{"type":"Feature","properties":{"type":"major","name":"Abuja Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nnamdi_Azikiwe_International_Airport","comments":null,"name_en":"Nnamdi Azikiwe International Airport"},"geometry":{"type":"Point","coordinates":[7.270259939743561,9.004376597810939]}},{"type":"Feature","properties":{"type":"mid","name":"Arcata-Eureka","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Arcata-Eureka_Airport","comments":null,"name_en":"Arcata-Eureka Airport"},"geometry":{"type":"Point","coordinates":[-124.107065520138548,40.971924538131439]}},{"type":"Feature","properties":{"type":"major","name":"Austin-Bergstrom Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Austin-Bergstrom_International_Airport","comments":null,"name_en":"Austin-Bergstrom International Airport"},"geometry":{"type":"Point","coordinates":[-97.666836764605435,30.202108192074945]}},{"type":"Feature","properties":{"type":"major","name":"Antalya","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Antalya_Airport","comments":null,"name_en":"Antalya Airport"},"geometry":{"type":"Point","coordinates":[30.802552643941521,36.915323305186774]}},{"type":"Feature","properties":{"type":"major","name":"Belfast Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Belfast_International_Airport","comments":null,"name_en":"Belfast International Airport"},"geometry":{"type":"Point","coordinates":[-6.216169437349579,54.661557547010318]}},{"type":"Feature","properties":{"type":"major","name":"Orio Al Serio","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Orio_al_Serio_Airport","comments":null,"name_en":"Il Caravaggio International Airport"},"geometry":{"type":"Point","coordinates":[9.698917693997402,45.665498056069453]}},{"type":"Feature","properties":{"type":"mid","name":"Kota Kinabalu Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kota_Kinabalu_International_Airport","comments":null,"name_en":"Kota Kinabalu International Airport"},"geometry":{"type":"Point","coordinates":[116.051087873369028,5.922894454748071]}},{"type":"Feature","properties":{"type":"major","name":"Bengaluru Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bengaluru_International_Airport","comments":null,"name_en":"Kempegowda International Airport"},"geometry":{"type":"Point","coordinates":[77.709557988957485,13.200610806960903]}},{"type":"Feature","properties":{"type":"major","name":"Canberra Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Canberra_International_Airport","comments":null,"name_en":"Canberra International Airport"},"geometry":{"type":"Point","coordinates":[149.190760539671317,-35.307185590290899]}},{"type":"Feature","properties":{"type":"major","name":"Port Columbus Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Port_Columbus_International_Airport","comments":null,"name_en":"John Glenn Columbus International Airport"},"geometry":{"type":"Point","coordinates":[-82.884030642663404,39.998118192243197]}},{"type":"Feature","properties":{"type":"major","name":"Mohamed V Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mohammed_V_International_Airport","comments":null,"name_en":"Mohammed V International Airport"},"geometry":{"type":"Point","coordinates":[-7.581455990257197,33.374727481539615]}},{"type":"Feature","properties":{"type":"major","name":"Düsseldorf Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/D%C3%BCsseldorf_International_Airport","comments":null,"name_en":"Düsseldorf Airport"},"geometry":{"type":"Point","coordinates":[6.76494446612174,51.278182042077397]}},{"type":"Feature","properties":{"type":"major","name":"Esenboğa Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Esenbo%C4%9Fa_International_Airport","comments":null,"name_en":"Ankara Esenboğa Airport"},"geometry":{"type":"Point","coordinates":[32.993010077201433,40.115127827323363]}},{"type":"Feature","properties":{"type":"mid","name":"Hamilton Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hamilton_International_Airport","comments":null,"name_en":"Hamilton International Airport"},"geometry":{"type":"Point","coordinates":[175.336221432708157,-37.865841148482694]}},{"type":"Feature","properties":{"type":"major","name":"Rajiv Gandhi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Rajiv_Gandhi_International_Airport","comments":null,"name_en":"Rajiv Gandhi International Airport"},"geometry":{"type":"Point","coordinates":[78.429536134519978,17.235983150747067]}},{"type":"Feature","properties":{"type":"major","name":"John F Kennedy Int'l","location":"parking","wikipedia":"http://en.wikipedia.org/wiki/John_F._Kennedy_International_Airport","comments":null,"name_en":"John F. Kennedy International Airport"},"geometry":{"type":"Point","coordinates":[-73.786326860929549,40.645959558408144]}},{"type":"Feature","properties":{"type":"major","name":"Boryspil Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Boryspil_International_Airport","comments":null,"name_en":"Boryspil International Airport"},"geometry":{"type":"Point","coordinates":[30.895162161552811,50.340902338876958]}},{"type":"Feature","properties":{"type":"major","name":"Khartoum","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Khartoum_International_Airport","comments":null,"name_en":"Khartoum International Airport"},"geometry":{"type":"Point","coordinates":[32.550153296632956,15.592222653085781]}},{"type":"Feature","properties":{"type":"major","name":"Dane Cty. Reg. (Truax Field)","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dane_County_Regional_Airport","comments":null,"name_en":"Dane County Regional Airport"},"geometry":{"type":"Point","coordinates":[-89.345784789448658,43.13630823858675]}},{"type":"Feature","properties":{"type":"major","name":"Minsk Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Minsk_International_Airport","comments":null,"name_en":"Minsk National Airport"},"geometry":{"type":"Point","coordinates":[28.034193334637767,53.88937923980054]}},{"type":"Feature","properties":{"type":"major","name":"Palermo","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Palermo_International_Airport","comments":null,"name_en":"Falcone–Borsellino Airport"},"geometry":{"type":"Point","coordinates":[13.105530988863753,38.186335108489494]}},{"type":"Feature","properties":{"type":"mid","name":"T.F. Green","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/T._F._Green_Airport","comments":null,"name_en":"T. F. Green Airport"},"geometry":{"type":"Point","coordinates":[-71.435784144578903,41.726001984718906]}},{"type":"Feature","properties":{"type":"major","name":"Southwest Florida Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Southwest_Florida_International_Airport","comments":null,"name_en":"Southwest Florida International Airport"},"geometry":{"type":"Point","coordinates":[-81.75512314093055,26.527928806765104]}},{"type":"Feature","properties":{"type":"major","name":"Shenyang Taoxian Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Shenyang_Taoxian_International_Airport","comments":null,"name_en":"Shenyang Taoxian International Airport"},"geometry":{"type":"Point","coordinates":[123.487974430338497,41.634789133958215]}},{"type":"Feature","properties":{"type":"major","name":"Sharjah Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sharjah_International_Airport","comments":null,"name_en":"Sharjah International Airport"},"geometry":{"type":"Point","coordinates":[55.520507194885283,25.321196401906818]}},{"type":"Feature","properties":{"type":"major","name":"San Jose Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/San_Jose_International_Airport","comments":null,"name_en":"San Jose International Airport"},"geometry":{"type":"Point","coordinates":[-121.929428983531537,37.369490590896547]}},{"type":"Feature","properties":{"type":"major","name":"John Wayne","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/John_Wayne_Airport","comments":null,"name_en":"John Wayne Airport"},"geometry":{"type":"Point","coordinates":[-117.861489220393395,33.679485732954902]}},{"type":"Feature","properties":{"type":"major","name":"Stuttgart","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Stuttgart_Airport","comments":null,"name_en":"Stuttgart Airport"},"geometry":{"type":"Point","coordinates":[9.193951089455357,48.690105135891287]}},{"type":"Feature","properties":{"type":"mid","name":"Nacional Tobías Bolaños","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tob%C3%ADas_Bola%C3%B1os_International_Airport","comments":"???","name_en":"Tobías Bolaños International Airport"},"geometry":{"type":"Point","coordinates":[-84.138609197159411,9.958278519196229]}},{"type":"Feature","properties":{"type":"major","name":"Shenzhen Bao'an Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Shenzhen_airport","comments":null,"name_en":"Shenzhen Bao'an International Airport"},"geometry":{"type":"Point","coordinates":[113.815852751085117,22.64650771478675]}},{"type":"Feature","properties":{"type":"major","name":"Louisville Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Louisville_International_Airport","comments":null,"name_en":"Louisville International Airport"},"geometry":{"type":"Point","coordinates":[-85.741702759736725,38.186020715269919]}},{"type":"Feature","properties":{"type":"major","name":"Geneva","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Geneva_Cointrin_International_Airport","comments":null,"name_en":"Geneva International Airport"},"geometry":{"type":"Point","coordinates":[6.107945774236034,46.231009510157953]}},{"type":"Feature","properties":{"type":"mid","name":"Lyon-Saint Exupery","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lyon-Saint_Exup%C3%A9ry_Airport","comments":null,"name_en":"Lyon-Saint Exupéry Airport"},"geometry":{"type":"Point","coordinates":[5.075944318134586,45.721018683466909]}},{"type":"Feature","properties":{"type":"major","name":"Kansai Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kansai_International_Airport","comments":null,"name_en":"Kansai International Airport"},"geometry":{"type":"Point","coordinates":[135.244459772476375,34.434794162926949]}},{"type":"Feature","properties":{"type":"major","name":"Lisbon Portela","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lisbon_Portela_Airport","comments":null,"name_en":"Lisbon Airport"},"geometry":{"type":"Point","coordinates":[-9.130694409310712,38.770762342751425]}},{"type":"Feature","properties":{"type":"major","name":"Tancredo Neves Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tancredo_Neves_International_Airport","comments":null,"name_en":"Tancredo Neves International Airport"},"geometry":{"type":"Point","coordinates":[-43.963581520994907,-19.63278212187474]}},{"type":"Feature","properties":{"type":"mid","name":"Bromma","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Stockholm-Bromma_Airport","comments":null,"name_en":"Stockholm Bromma Airport"},"geometry":{"type":"Point","coordinates":[17.945617540614503,59.355590206511224]}},{"type":"Feature","properties":{"type":"major","name":"Juanda Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Juanda_International_Airport","comments":null,"name_en":"Juanda International Airport"},"geometry":{"type":"Point","coordinates":[112.777034594932971,-7.383578985275999]}},{"type":"Feature","properties":{"type":"mid","name":"Astor Piazzolla Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/%C3%81stor_Piazzola_International_Airport","comments":null,"name_en":"Astor Piazzolla International Airport"},"geometry":{"type":"Point","coordinates":[-57.581615093239215,-37.933216120448158]}},{"type":"Feature","properties":{"type":"major","name":"Owen Roberts Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Owen_Roberts_International_Airport","comments":null,"name_en":"Owen Roberts International Airport"},"geometry":{"type":"Point","coordinates":[-81.35767061622893,19.29591074371222]}},{"type":"Feature","properties":{"type":"major","name":"Zhengzhou Xinzheng Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Zhengzhou_Xinzheng_International_Airport","comments":null,"name_en":"Zhengzhou Xinzheng International Airport"},"geometry":{"type":"Point","coordinates":[113.841831302844511,34.526302719895668]}},{"type":"Feature","properties":{"type":"major","name":"Dalian Zhoushuizi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dalian_Zhoushuizi_International_Airport","comments":null,"name_en":"Dalian Zhoushuizi International Airport"},"geometry":{"type":"Point","coordinates":[121.538913780101169,38.961570230022161]}},{"type":"Feature","properties":{"type":"major","name":"Heraklion Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Heraklion_International_Airport%2C_%22Nikos_Kazantzakis%22","comments":null,"name_en":"Heraklion International Airport"},"geometry":{"type":"Point","coordinates":[25.17405582432718,35.33690241010455]}},{"type":"Feature","properties":{"type":"major","name":"Tbilisi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tbilisi_International_Airport","comments":null,"name_en":"Tbilisi International Airport"},"geometry":{"type":"Point","coordinates":[44.964614614166365,41.669442018726052]}},{"type":"Feature","properties":{"type":"mid","name":"Cascais","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Cascais_Aerodrome","comments":null,"name_en":"Cascais Municipal Aerodrome"},"geometry":{"type":"Point","coordinates":[-9.354582402639275,38.723535320832347]}},{"type":"Feature","properties":{"type":"major","name":"Kaohsiung Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kaohsiung_International_Airport","comments":null,"name_en":"Kaohsiung International Airport"},"geometry":{"type":"Point","coordinates":[120.345156342150631,22.57170610544221]}},{"type":"Feature","properties":{"type":"mid","name":"Sadiq Abubakar III","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sadiq_Abubakar_III_International_Airport","comments":null,"name_en":"Sadiq Abubakar III International Airport"},"geometry":{"type":"Point","coordinates":[5.200226160326513,12.917482416618078]}},{"type":"Feature","properties":{"type":"mid","name":"Mariscal Sucre Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mariscal_Sucre_International_Airport","comments":null,"name_en":"Mariscal Sucre International Airport"},"geometry":{"type":"Point","coordinates":[-78.489992554570051,-0.145552408466882]}},{"type":"Feature","properties":{"type":"mid","name":"Karachi Civil","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jinnah_International_Airport","comments":null,"name_en":"Jinnah International Airport"},"geometry":{"type":"Point","coordinates":[67.152128359294665,24.898524368959485]}},{"type":"Feature","properties":{"type":"mid","name":"Kishinev S.E.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chi%C5%9Fin%C4%83u_International_Airport","comments":"???","name_en":"Chișinău International Airport"},"geometry":{"type":"Point","coordinates":[28.936048756225549,46.934161990039122]}},{"type":"Feature","properties":{"type":"major","name":"Jorge Chávez","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jorge_Ch%C3%A1vez_International_Airport","comments":"ok","name_en":"Jorge Chávez International Airport"},"geometry":{"type":"Point","coordinates":[-77.107565693134219,-12.0237161502221]}},{"type":"Feature","properties":{"type":"mid","name":"Thunder Bay Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Thunder_Bay_International_Airport","comments":null,"name_en":"Thunder Bay International Airport"},"geometry":{"type":"Point","coordinates":[-89.312142123813615,48.37188114925079]}},{"type":"Feature","properties":{"type":"major","name":"Vilnius","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Vilnius_International_Airport","comments":null,"name_en":"Vilnius Airport"},"geometry":{"type":"Point","coordinates":[25.280716449728459,54.643054930754239]}},{"type":"Feature","properties":{"type":"major","name":"Hsien Yang","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Xi'an_Xianyang_International_Airport","comments":"???","name_en":"Xi'an Xianyang International Airport"},"geometry":{"type":"Point","coordinates":[108.755811342150636,34.442939105442214]}},{"type":"Feature","properties":{"type":"mid","name":"Del Norte Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Del_Norte_International_Airport","comments":null,"name_en":"Del Norte International Airport"},"geometry":{"type":"Point","coordinates":[-100.238394186576699,25.859873767729045]}},{"type":"Feature","properties":{"type":"mid","name":"Fua'amotu Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Fua'amotu_International_Airport","comments":null,"name_en":"Fuaʻamotu International Airport"},"geometry":{"type":"Point","coordinates":[-175.135635,-21.24861]}},{"type":"Feature","properties":{"type":"mid","name":"Esfahan Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Isfahan_International_Airport","comments":null,"name_en":"Isfahan International Airport"},"geometry":{"type":"Point","coordinates":[51.876391681268089,32.74608053443211]}},{"type":"Feature","properties":{"type":"mid","name":"Harare Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Harare_International_Airport","comments":null,"name_en":"Harare International Airport"},"geometry":{"type":"Point","coordinates":[31.1014,-17.9228]}},{"type":"Feature","properties":{"type":"major","name":"Kuwait Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kuwait_International_Airport","comments":null,"name_en":"Kuwait International Airport"},"geometry":{"type":"Point","coordinates":[47.971482559331648,29.239680058158292]}},{"type":"Feature","properties":{"type":"major","name":"Macdonald-Cartier Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ottawa_Macdonald-Cartier_International_Airport","comments":null,"name_en":"Ottawa Macdonald-Cartier International Airport"},"geometry":{"type":"Point","coordinates":[-75.664893387020527,45.320134819653099]}},{"type":"Feature","properties":{"type":"mid","name":"Kabul Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kabul_International_Airport","comments":null,"name_en":"Hamid Karzai International Airport"},"geometry":{"type":"Point","coordinates":[69.210073627087411,34.563397886414911]}},{"type":"Feature","properties":{"type":"mid","name":"Abidjan Port Bouet","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Port_Bouet_Airport","comments":null,"name_en":"Port Bouet Airport"},"geometry":{"type":"Point","coordinates":[-3.932219291676359,5.254398445149204]}},{"type":"Feature","properties":{"type":"major","name":"General Juan N Alvarez Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Juan_N._%C3%81lvarez_International_Airport","comments":null,"name_en":"General Juan N. Álvarez International Airport"},"geometry":{"type":"Point","coordinates":[-99.754508561968123,16.761967352779976]}},{"type":"Feature","properties":{"type":"major","name":"Kotoka Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kotoka_International_Airport","comments":null,"name_en":"Kotoka International Airport"},"geometry":{"type":"Point","coordinates":[-0.171402855660817,5.606981523811933]}},{"type":"Feature","properties":{"type":"mid","name":"Bole Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bole_International_Airport","comments":null,"name_en":"Addis Ababa Bole International Airport"},"geometry":{"type":"Point","coordinates":[38.793190436634298,8.981730275810992]}},{"type":"Feature","properties":{"type":"mid","name":"Aden Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Aden_International_Airport","comments":null,"name_en":"Aden International Airport"},"geometry":{"type":"Point","coordinates":[45.030602,12.8278]}},{"type":"Feature","properties":{"type":"mid","name":"Adelaide Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Adelaide_International_Airport","comments":null,"name_en":"Adelaide Airport"},"geometry":{"type":"Point","coordinates":[138.532101457699099,-34.940586027515401]}},{"type":"Feature","properties":{"type":"major","name":"Almaty Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Almaty_International_Airport","comments":null,"name_en":"Almaty International Airport"},"geometry":{"type":"Point","coordinates":[77.012045877117473,43.346494314479287]}},{"type":"Feature","properties":{"type":"major","name":"Houari Boumediene","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Houari_Boumedienne_Airport","comments":null,"name_en":"Algiers Houari Boumediene Airport"},"geometry":{"type":"Point","coordinates":[3.212073535165055,36.699720666353457]}},{"type":"Feature","properties":{"type":"major","name":"Aleppo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Aleppo_International_Airport","comments":null,"name_en":"Aleppo International Airport"},"geometry":{"type":"Point","coordinates":[37.227341405782823,36.184623731431358]}},{"type":"Feature","properties":{"type":"mid","name":"Sardar Vallabhbhai Patel Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sardar_Vallabhbhai_Patel_International_Airport","comments":null,"name_en":"Sardar Vallabhbhai Patel International Airport"},"geometry":{"type":"Point","coordinates":[72.62090008843316,23.070745463588118]}},{"type":"Feature","properties":{"type":"mid","name":"Cerro Moreno Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cerro_Moreno_International_Airport","comments":"???","name_en":"Andrés Sabella Airport"},"geometry":{"type":"Point","coordinates":[-70.440990850940665,-23.448954524831667]}},{"type":"Feature","properties":{"type":"mid","name":"Ashkhabad Northwest","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ashgabat_Airport","comments":null,"name_en":"Ashgabat International Airport"},"geometry":{"type":"Point","coordinates":[58.363965920824604,37.984853438956989]}},{"type":"Feature","properties":{"type":"mid","name":"Yohannes Iv Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Asmara_International_Airport","comments":null,"name_en":"Asmara International Airport"},"geometry":{"type":"Point","coordinates":[38.906354013632139,15.29361596964986]}},{"type":"Feature","properties":{"type":"mid","name":"Silvio Pettirossi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Silvio_Pettirossi_International_Airport","comments":null,"name_en":"Silvio Pettirossi International Airport"},"geometry":{"type":"Point","coordinates":[-57.513907824713627,-25.241659253381577]}},{"type":"Feature","properties":{"type":"mid","name":"Bermuda Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bermuda_International_Airport","comments":null,"name_en":"L.F. Wade International Airport"},"geometry":{"type":"Point","coordinates":[-64.702774068651422,32.359173960158074]}},{"type":"Feature","properties":{"type":"major","name":"Surcin","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Belgrade_Nikola_Tesla_Airport","comments":null,"name_en":"Belgrade Nikola Tesla Airport"},"geometry":{"type":"Point","coordinates":[20.291284594662077,44.819076665443262]}},{"type":"Feature","properties":{"type":"major","name":"Beirut Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Beirut_Rafic_Hariri_International_Airport","comments":null,"name_en":"Beirut–Rafic Hariri International Airport"},"geometry":{"type":"Point","coordinates":[35.4930853618161,33.825440061866765]}},{"type":"Feature","properties":{"type":"mid","name":"Bairagarh","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bhopal_Airport","comments":null,"name_en":"Raja Bhoj Airport"},"geometry":{"type":"Point","coordinates":[77.340871471357943,23.285568486980882]}},{"type":"Feature","properties":{"type":"mid","name":"Bamako Sénou","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Senou_International_Airport","comments":null,"name_en":"Bamako-Sénou International Airport"},"geometry":{"type":"Point","coordinates":[-7.947272269708012,12.539336342586719]}},{"type":"Feature","properties":{"type":"major","name":"Nashville Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nashville_International_Airport","comments":null,"name_en":"Nashville International Airport"},"geometry":{"type":"Point","coordinates":[-86.669286735637471,36.13148763616973]}},{"type":"Feature","properties":{"type":"major","name":"Brisbane Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Brisbane_Airport","comments":null,"name_en":"Brisbane Airport"},"geometry":{"type":"Point","coordinates":[153.120256418843894,-27.385396593909881]}},{"type":"Feature","properties":{"type":"major","name":"Boise Air Terminal","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Boise_Airport","comments":null,"name_en":"Boise Airport"},"geometry":{"type":"Point","coordinates":[-116.221841070548706,43.568959223470401]}},{"type":"Feature","properties":{"type":"mid","name":"Wiley Post Will Rogers Mem.","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Wiley_Post-Will_Rogers_Memorial_Airport","comments":null,"name_en":"Wiley Post–Will Rogers Memorial Airport"},"geometry":{"type":"Point","coordinates":[-156.771835,71.289299]}},{"type":"Feature","properties":{"type":"major","name":"Greater Buffalo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Buffalo_Niagara_International_Airport","comments":null,"name_en":"Buffalo Niagara International Airport"},"geometry":{"type":"Point","coordinates":[-78.731996552330827,42.934033749352587]}},{"type":"Feature","properties":{"type":"mid","name":"Bulawayo","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Joshua_Mqabuko_Nkomo_International_Airport","comments":null,"name_en":"Joshua Mqabuko Nkomo International Airport"},"geometry":{"type":"Point","coordinates":[28.622552042904037,-20.015568409490825]}},{"type":"Feature","properties":{"type":"major","name":"Brunei Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Brunei_International_Airport","comments":null,"name_en":"Brunei International Airport"},"geometry":{"type":"Point","coordinates":[114.933119029209365,4.945475282276854]}},{"type":"Feature","properties":{"type":"major","name":"Guangzhou Baiyun Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Guangzhou_Baiyun_International_Airport","comments":null,"name_en":"Guangzhou Baiyun International Airport"},"geometry":{"type":"Point","coordinates":[113.297516552170663,23.389151157324299]}},{"type":"Feature","properties":{"type":"mid","name":"Carriel Sur Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Carriel_Sur_International_Airport","comments":null,"name_en":"Carriel Sur International Airport"},"geometry":{"type":"Point","coordinates":[-73.062106174621391,-36.776372743788102]}},{"type":"Feature","properties":{"type":"major","name":"Netaji Subhash Chandra Bose Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Netaji_Subhash_Chandra_Bose_International_Airport","comments":null,"name_en":"Netaji Subhas Chandra Bose International Airport"},"geometry":{"type":"Point","coordinates":[88.440001013019653,22.645389378506415]}},{"type":"Feature","properties":{"type":"mid","name":"Chittagong","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Shah_Amanat_International_Airport","comments":null,"name_en":"Shah Amanat International Airport"},"geometry":{"type":"Point","coordinates":[91.814710716238338,22.245565858573752]}},{"type":"Feature","properties":{"type":"major","name":"Christchurch Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Christchurch_International_Airport","comments":null,"name_en":"Christchurch International Airport"},"geometry":{"type":"Point","coordinates":[172.538675565223173,-43.488548678410382]}},{"type":"Feature","properties":{"type":"mid","name":"Conakry","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Conakry_International_Airport","comments":null,"name_en":"Conakry International Airport"},"geometry":{"type":"Point","coordinates":[-13.621065625167132,9.574181158500823]}},{"type":"Feature","properties":{"type":"major","name":"Hopkins Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cleveland_Hopkins_International_Airport","comments":null,"name_en":"Cleveland Hopkins International Airport"},"geometry":{"type":"Point","coordinates":[-81.838440606404575,41.411191612496609]}},{"type":"Feature","properties":{"type":"mid","name":"Alfonso Bonilla Aragón Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Alfonso_Bonilla_Arag%C3%B3n_International_Airport","comments":null,"name_en":"Alfonso Bonilla Aragón International Airport"},"geometry":{"type":"Point","coordinates":[-76.385071472809088,3.543286351232192]}},{"type":"Feature","properties":{"type":"mid","name":"Cotonou Cadjehon","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cadjehoun_Airport","comments":null,"name_en":"Cadjehoun Airport"},"geometry":{"type":"Point","coordinates":[2.383800072435198,6.3582465034691]}},{"type":"Feature","properties":{"type":"mid","name":"Ingeniero Ambrosio L.V. Taravella Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ingeniero_Ambrosio_L.V._Taravella_International_Airport","comments":null,"name_en":"Ingeniero Aeronáutico Ambrosio L.V. Taravella International Airport"},"geometry":{"type":"Point","coordinates":[-64.212315767080071,-31.315681168488879]}},{"type":"Feature","properties":{"type":"mid","name":"Rafael Nunez","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Rafael_N%C3%BA%C3%B1ez_International_Airport","comments":null,"name_en":"Rafael Núñez International Airport"},"geometry":{"type":"Point","coordinates":[-75.512334955968242,10.444938176491519]}},{"type":"Feature","properties":{"type":"major","name":"Cancún","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Canc%C3%BAn_International_Airport","comments":null,"name_en":"Cancún International Airport"},"geometry":{"type":"Point","coordinates":[-86.874417250669438,21.040196671440029]}},{"type":"Feature","properties":{"type":"mid","name":"General R F Villalobos Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Roberto_Fierro_Villalobos_International_Airport","comments":null,"name_en":"General Roberto Fierro Villalobos International Airport"},"geometry":{"type":"Point","coordinates":[-105.969204692629006,28.703998499767941]}},{"type":"Feature","properties":{"type":"mid","name":"Zia Int'l Dhaka","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Zia_International_Airport","comments":null,"name_en":"Shahjalal International Airport"},"geometry":{"type":"Point","coordinates":[90.404924159923667,23.848124321812691]}},{"type":"Feature","properties":{"type":"major and military","name":"Darwin Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Darwin_International_Airport","comments":null,"name_en":"Darwin International Airport"},"geometry":{"type":"Point","coordinates":[130.877501436773912,-12.40805599665558]}},{"type":"Feature","properties":{"type":"mid","name":"Louis Botha","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Durban_International_Airport","comments":null,"name_en":"Durban International Airport"},"geometry":{"type":"Point","coordinates":[30.945708194088084,-29.965914250828032]}},{"type":"Feature","properties":{"type":"mid","name":"Lubumbashi Luano Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lubumbashi_International_Airport","comments":null,"name_en":"Lubumbashi International Airport"},"geometry":{"type":"Point","coordinates":[27.5292,-11.5908]}},{"type":"Feature","properties":{"type":"mid","name":"Saiss","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sa%C3%AFss_Airport","comments":null,"name_en":"Fes-Saïss Airport"},"geometry":{"type":"Point","coordinates":[-4.982146376783026,33.930525184467264]}},{"type":"Feature","properties":{"type":"mid","name":"Kinshasa N Djili Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kinshasa_International_Airport","comments":null,"name_en":"International airport of Ndjili"},"geometry":{"type":"Point","coordinates":[15.446516207456082,-4.389168821975817]}},{"type":"Feature","properties":{"type":"mid","name":"Freetown Lungi","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lungi_International_Airport","comments":null,"name_en":"Lungi International Airport"},"geometry":{"type":"Point","coordinates":[-13.200229678648256,8.615423617263689]}},{"type":"Feature","properties":{"type":"mid","name":"Sunan","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sunan_International_Airport","comments":null,"name_en":"Pyongyang International Airport"},"geometry":{"type":"Point","coordinates":[125.675321571200556,39.200177166765556]}},{"type":"Feature","properties":{"type":"major","name":"Vasilyevka","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Manas_International_Airport","comments":"maybe , but no \"Vasilyevka\"","name_en":"Manas International Airport"},"geometry":{"type":"Point","coordinates":[74.468800339908981,43.055452723330326]}},{"type":"Feature","properties":{"type":"mid","name":"Sir Seretse Khama Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sir_Seretse_Khama_International_Airport","comments":null,"name_en":"Sir Seretse Khama International Airport"},"geometry":{"type":"Point","coordinates":[25.924380826414669,-24.558071808944057]}},{"type":"Feature","properties":{"type":"major","name":"Don Miguel Hidalgo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Don_Miguel_Hidalgo_y_Costilla_International_Airport","comments":null,"name_en":"Miguel Hidalgo y Costilla Guadalajara International Airport"},"geometry":{"type":"Point","coordinates":[-103.300766222751776,20.524686348517278]}},{"type":"Feature","properties":{"type":"major","name":"Glasgow Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Glasgow_International_Airport","comments":null,"name_en":"Glasgow Airport"},"geometry":{"type":"Point","coordinates":[-4.431677969951069,55.864182857035459]}},{"type":"Feature","properties":{"type":"mid","name":"La Aurora","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/La_Aurora_International_Airport","comments":null,"name_en":"La Aurora International Airport"},"geometry":{"type":"Point","coordinates":[-90.530181111377985,14.588160829005092]}},{"type":"Feature","properties":{"type":"mid","name":"Simon Bolivar Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jos%C3%A9_Joaqu%C3%ADn_de_Olmedo_International_Airport","comments":null,"name_en":"José Joaquín de Olmedo International Airport"},"geometry":{"type":"Point","coordinates":[-79.887009643932956,-2.158337906991362]}},{"type":"Feature","properties":{"type":"major","name":"Noi Bai","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Noi_Bai_International_Airport","comments":null,"name_en":"Noi Bai International Airport"},"geometry":{"type":"Point","coordinates":[105.803759436805763,21.214559670724526]}},{"type":"Feature","properties":{"type":"major","name":"José Martí Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jos%C3%A9_Mart%C3%AD_International_Airport","comments":null,"name_en":"José Martí International Airport"},"geometry":{"type":"Point","coordinates":[-82.407420628949893,22.997353336442771]}},{"type":"Feature","properties":{"type":"mid","name":"Borg El Arab Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Borg_El_Arab_Airport","comments":null,"name_en":"Borg El Arab Airport"},"geometry":{"type":"Point","coordinates":[29.692666015230046,30.918371278623891]}},{"type":"Feature","properties":{"type":"major","name":"King Abdul Aziz Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/King_Abdulaziz_International_Airport","comments":null,"name_en":"King Abdulaziz International Airport"},"geometry":{"type":"Point","coordinates":[39.150499678044795,21.670685787812808]}},{"type":"Feature","properties":{"type":"mid","name":"Kano Mallam Aminu Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mallam_Aminu_Kano_International_Airport","comments":null,"name_en":"Mallam Aminu Kano International Airport"},"geometry":{"type":"Point","coordinates":[8.522137183957666,12.045707160174642]}},{"type":"Feature","properties":{"type":"mid","name":"Kashi","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kashgar_Airport","comments":null,"name_en":"Kashgar Airport"},"geometry":{"type":"Point","coordinates":[76.013014806007476,39.537968630625755]}},{"type":"Feature","properties":{"type":"major","name":"Norman Manley Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Norman_Manley_International_Airport","comments":null,"name_en":"Norman Manley International Airport"},"geometry":{"type":"Point","coordinates":[-76.778689761657645,17.937575155275226]}},{"type":"Feature","properties":{"type":"mid","name":"Tribhuvan Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tribhuvan_International_Airport","comments":null,"name_en":"Tribhuvan International Airport"},"geometry":{"type":"Point","coordinates":[85.357139531667997,27.700281675160912]}},{"type":"Feature","properties":{"type":"mid","name":"Luanda 4 de Fevereiro","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Quatro_de_Fevereiro_Airport","comments":null,"name_en":"Quatro de Fevereiro Airport"},"geometry":{"type":"Point","coordinates":[13.234795750269944,-8.848313279173791]}},{"type":"Feature","properties":{"type":"major","name":"Pulkovo 2","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Pulkovo_Airport","comments":null,"name_en":"Pulkovo Airport"},"geometry":{"type":"Point","coordinates":[30.30709764546479,59.805406160189726]}},{"type":"Feature","properties":{"type":"mid","name":"Allama Iqbal Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Allama_Iqbal_International_Airport","comments":null,"name_en":"Allama Iqbal International Airport"},"geometry":{"type":"Point","coordinates":[74.41088101817482,31.520629651820634]}},{"type":"Feature","properties":{"type":"mid","name":"Kamuzu Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lilongwe_International_Airport","comments":null,"name_en":"Lilongwe International Airport"},"geometry":{"type":"Point","coordinates":[33.782788501978828,-13.788622823745978]}},{"type":"Feature","properties":{"type":"major","name":"Lagos Murtala Muhammed","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Murtala_Mohammed_International_Airport","comments":null,"name_en":"Murtala Muhammed International Airport"},"geometry":{"type":"Point","coordinates":[3.321124352813337,6.578259445404671]}},{"type":"Feature","properties":{"type":"mid","name":"El Alto Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/El_Alto_International_Airport","comments":null,"name_en":"El Alto International Airport"},"geometry":{"type":"Point","coordinates":[-68.178005527794483,-16.509879221397668]}},{"type":"Feature","properties":{"type":"mid","name":"Lusaka Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lusaka_International_Airport","comments":"ok","name_en":"Kenneth Kaunda International Airport"},"geometry":{"type":"Point","coordinates":[28.445544321101909,-15.326852250944736]}},{"type":"Feature","properties":{"type":"mid","name":"Luxor","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Luxor_International_Airport","comments":null,"name_en":"Luxor International Airport"},"geometry":{"type":"Point","coordinates":[32.703297084862257,25.673034778602332]}},{"type":"Feature","properties":{"type":"major","name":"Chennai Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chennai_International_Airport","comments":null,"name_en":"Chennai International Airport"},"geometry":{"type":"Point","coordinates":[80.163775973154515,12.982530166915435]}},{"type":"Feature","properties":{"type":"mid","name":"La Chinita Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/La_Chinita_International_Airport","comments":null,"name_en":"La Chinita International Airport"},"geometry":{"type":"Point","coordinates":[-71.723768809468666,10.555759468497213]}},{"type":"Feature","properties":{"type":"mid","name":"José María Córdova","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jos%C3%A9_Mar%C3%ADa_C%C3%B3rdova_International_Airport","comments":null,"name_en":"José María Córdova International Airport"},"geometry":{"type":"Point","coordinates":[-75.426955739977203,6.171001614358001]}},{"type":"Feature","properties":{"type":"major","name":"Memphis Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Memphis_International_Airport","comments":null,"name_en":"Memphis International Airport"},"geometry":{"type":"Point","coordinates":[-89.981628035323709,35.044410124008941]}},{"type":"Feature","properties":{"type":"mid","name":"Augusto Cesar Sandino Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Augusto_C._Sandino_International_Airport","comments":null,"name_en":"Augusto C. Sandino International Airport"},"geometry":{"type":"Point","coordinates":[-86.171284622954303,12.144635873435028]}},{"type":"Feature","properties":{"type":"major","name":"Mashhad","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mashhad_International_Airport","comments":null,"name_en":"Mashhad International Airport"},"geometry":{"type":"Point","coordinates":[59.642194357402929,36.227550313498362]}},{"type":"Feature","properties":{"type":"major","name":"Miami Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Miami_International_Airport","comments":null,"name_en":"Miami International Airport"},"geometry":{"type":"Point","coordinates":[-80.278971827744101,25.794940721240621]}},{"type":"Feature","properties":{"type":"mid","name":"Lic M Crecencio Rejon Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Manuel_Crescencio_Rej%C3%B3n_International_Airport","comments":null,"name_en":"Manuel Crescencio Rejón International Airport"},"geometry":{"type":"Point","coordinates":[-89.663023573643429,20.933860386429597]}},{"type":"Feature","properties":{"type":"major","name":"Luqa","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Malta_International_Airport","comments":null,"name_en":"Malta International Airport"},"geometry":{"type":"Point","coordinates":[14.495264455505483,35.848930794350125]}},{"type":"Feature","properties":{"type":"major","name":"Moi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Moi_International_Airport","comments":null,"name_en":"Moi International Airport"},"geometry":{"type":"Point","coordinates":[39.602663187038331,-4.032652625796572]}},{"type":"Feature","properties":{"type":"mid","name":"Moshoeshoe I Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Moshoeshoe_I_International_Airport","comments":null,"name_en":"Moshoeshoe I International Airport"},"geometry":{"type":"Point","coordinates":[27.559216033361427,-29.455574004610121]}},{"type":"Feature","properties":{"type":"major","name":"New Orleans Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Louis_Armstrong_New_Orleans_International_Airport","comments":null,"name_en":"Louis Armstrong New Orleans International Airport"},"geometry":{"type":"Point","coordinates":[-90.256693948059421,29.985114146062223]}},{"type":"Feature","properties":{"type":"major and military","name":"Multan","location":"runway","wikipedia":"http://en.wikipedia.org/wiki/Multan_International_Airport","comments":null,"name_en":"Multan International Airport"},"geometry":{"type":"Point","coordinates":[71.418995432931979,30.195078090496487]}},{"type":"Feature","properties":{"type":"major","name":"Carrasco Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Carrasco_International_Airport","comments":null,"name_en":"Carrasco International Airport"},"geometry":{"type":"Point","coordinates":[-56.026636146282002,-34.841048598856858]}},{"type":"Feature","properties":{"type":"mid","name":"General Rafael Buelna Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Rafael_Buelna_International_Airport","comments":null,"name_en":"General Rafael Buelna International Airport"},"geometry":{"type":"Point","coordinates":[-106.270016617885332,23.166596097134448]}},{"type":"Feature","properties":{"type":"major","name":"Nassau Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lynden_Pindling_International_Airport","comments":null,"name_en":"Lynden Pindling International Airport"},"geometry":{"type":"Point","coordinates":[-77.464847229094417,25.048691060086554]}},{"type":"Feature","properties":{"type":"mid","name":"Ndjamena","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/N'Djamena_International_Airport","comments":null,"name_en":"N'Djamena International Airport"},"geometry":{"type":"Point","coordinates":[15.03304463855593,12.129540018411483]}},{"type":"Feature","properties":{"type":"mid","name":"Niamey","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Diori_Hamani_International_Airport","comments":null,"name_en":"Diori Hamani International Airport"},"geometry":{"type":"Point","coordinates":[2.17730671184125,13.476757280794157]}},{"type":"Feature","properties":{"type":"major","name":"Mactan-Cebu Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mactan-Cebu_International_Airport","comments":null,"name_en":"Mactan–Cebu International Airport"},"geometry":{"type":"Point","coordinates":[123.979134508663762,10.315875672729177]}},{"type":"Feature","properties":{"type":"mid","name":"Nova Lisboa","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nova_Lisboa_Airport","comments":null,"name_en":"Albano Machado Airport"},"geometry":{"type":"Point","coordinates":[15.749761845959533,-12.802541457591508]}},{"type":"Feature","properties":{"type":"mid","name":"Eppley Airfield","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Eppley_Airfield","comments":null,"name_en":"Eppley Airfield"},"geometry":{"type":"Point","coordinates":[-95.899415795312109,41.299711145301231]}},{"type":"Feature","properties":{"type":"mid","name":"Nome","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nome_Airport","comments":null,"name_en":"Nome Airport"},"geometry":{"type":"Point","coordinates":[-165.44164171228104,64.507220702663091]}},{"type":"Feature","properties":{"type":"mid","name":"Ouagadougou","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ouagadougou_Airport","comments":null,"name_en":"Ouagadougou Airport"},"geometry":{"type":"Point","coordinates":[-1.513805361651135,12.353580026047329]}},{"type":"Feature","properties":{"type":"mid","name":"Mais Gate Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Toussaint_Louverture_International_Airport","comments":null,"name_en":"Toussaint Louverture International Airport"},"geometry":{"type":"Point","coordinates":[-72.294478026047329,18.575682905428639]}},{"type":"Feature","properties":{"type":"mid","name":"Puebla","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hermanos_Serd%C3%A1n_International_Airport","comments":null,"name_en":"Hermanos Serdán International Airport"},"geometry":{"type":"Point","coordinates":[-98.375759790423018,19.163793546584049]}},{"type":"Feature","properties":{"type":"major","name":"Portland Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Portland_International_Airport","comments":null,"name_en":"Portland International Airport"},"geometry":{"type":"Point","coordinates":[-122.592738881254107,45.588956931530532]}},{"type":"Feature","properties":{"type":"major","name":"Perth Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Perth_Airport","comments":null,"name_en":"Perth Airport"},"geometry":{"type":"Point","coordinates":[115.974224942232595,-31.941129794578288]}},{"type":"Feature","properties":{"type":"mid","name":"H F Verwoerd","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Port_Elizabeth_Airport","comments":null,"name_en":"Chief Dawid Stuurman International Airport"},"geometry":{"type":"Point","coordinates":[25.611777756760176,-33.984087743137351]}},{"type":"Feature","properties":{"type":"mid","name":"El Tepual Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/El_Tepual_Airport","comments":null,"name_en":"El Tepual Airport"},"geometry":{"type":"Point","coordinates":[-73.098384133642355,-41.433382070226884]}},{"type":"Feature","properties":{"type":"major","name":"Pochentong","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Phnom_Penh_International_Airport","comments":null,"name_en":"Phnom Penh International Airport"},"geometry":{"type":"Point","coordinates":[104.845027612456974,11.552644917651318]}},{"type":"Feature","properties":{"type":"major and military","name":"Pune","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Pune_Airport","comments":null,"name_en":"Pune Airport"},"geometry":{"type":"Point","coordinates":[73.908983811001647,18.579176611532837]}},{"type":"Feature","properties":{"type":"major","name":"Port Moresby Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jacksons_International_Airport","comments":null,"name_en":"Jacksons International Airport"},"geometry":{"type":"Point","coordinates":[147.211250855977141,-9.438652693161419]}},{"type":"Feature","properties":{"type":"major","name":"Tocumen Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tocumen_International_Airport","comments":null,"name_en":"Tocumen International Airport"},"geometry":{"type":"Point","coordinates":[-79.387134821543782,9.066872422658388]}},{"type":"Feature","properties":{"type":"mid","name":"Carlos Ibáñez de Campo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Carlos_Ibanez_Del_Campo_International_Airport","comments":null,"name_en":"Presidente Carlos Ibáñez del Campo International Airport"},"geometry":{"type":"Point","coordinates":[-70.843123785132434,-53.005069825517666]}},{"type":"Feature","properties":{"type":"major","name":"Durham Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Raleigh-Durham_International_Airport","comments":null,"name_en":"Raleigh–Durham International Airport"},"geometry":{"type":"Point","coordinates":[-78.791381400675078,35.875232345225498]}},{"type":"Feature","properties":{"type":"major","name":"Mingaladon","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Yangon_International_Airport","comments":null,"name_en":"Yangon International Airport"},"geometry":{"type":"Point","coordinates":[96.134194611494678,16.901154281825079]}},{"type":"Feature","properties":{"type":"major","name":"Riga","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Riga_International_Airport","comments":null,"name_en":"Riga International Airport"},"geometry":{"type":"Point","coordinates":[23.979379111699508,56.922003878609694]}},{"type":"Feature","properties":{"type":"mid","name":"Sanaa Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sana'a_International_Airport","comments":null,"name_en":"Sana'a International Airport"},"geometry":{"type":"Point","coordinates":[44.22464679025606,15.473902775573739]}},{"type":"Feature","properties":{"type":"major","name":"Baghdad Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Baghdad_International_Airport","comments":null,"name_en":"Baghdad International Airport"},"geometry":{"type":"Point","coordinates":[44.228912535294157,33.268162986377043]}},{"type":"Feature","properties":{"type":"major","name":"De Las Américas Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Las_Am%C3%A9ricas_International_Airport","comments":null,"name_en":"Las Américas International Airport"},"geometry":{"type":"Point","coordinates":[-69.676472675466727,18.430219694817325]}},{"type":"Feature","properties":{"type":"major","name":"Tan Son Nhat","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tan_Son_Nhat_International_Airport","comments":null,"name_en":"Tan Son Nhat International Airport"},"geometry":{"type":"Point","coordinates":[106.664246141374761,10.816300557187912]}},{"type":"Feature","properties":{"type":"major","name":"Thessaloniki","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Thessaloniki_International_Airport%2C_%22Macedonia%22","comments":null,"name_en":"Thessaloniki Airport \"Makedonia\""},"geometry":{"type":"Point","coordinates":[22.976435361061277,40.523873688777513]}},{"type":"Feature","properties":{"type":"major","name":"Vrazhdebna","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sofia_Airport","comments":null,"name_en":"Sofia Airport"},"geometry":{"type":"Point","coordinates":[23.402452135770766,42.6891841273195]}},{"type":"Feature","properties":{"type":"major","name":"Surat","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Surat_Airport","comments":null,"name_en":"Surat Airport"},"geometry":{"type":"Point","coordinates":[72.742438437258912,21.120450329717173]}},{"type":"Feature","properties":{"type":"mid","name":"Nausori Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Nausori_International_Airport","comments":null,"name_en":"Nausori International Airport"},"geometry":{"type":"Point","coordinates":[178.560048369959304,-18.045899692285367]}},{"type":"Feature","properties":{"type":"major","name":"Shiraz Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Shiraz_International_Airport","comments":null,"name_en":"Shiraz International Airport"},"geometry":{"type":"Point","coordinates":[52.58977127452107,29.545801384287437]}},{"type":"Feature","properties":{"type":"mid","name":"Gen Francisco J Mina Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Francisco_Javier_Mina_International_Airport","comments":null,"name_en":"General Francisco Javier Mina International Airport"},"geometry":{"type":"Point","coordinates":[-97.869813756839406,22.289331952506398]}},{"type":"Feature","properties":{"type":"mid","name":"Toncontin Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Toncont%C3%ADn_International_Airport","comments":null,"name_en":"Toncontín International Airport"},"geometry":{"type":"Point","coordinates":[-87.219211634898642,14.0599852192071]}},{"type":"Feature","properties":{"type":"major","name":"Mehrabad Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mehrabad_International_Airport","comments":null,"name_en":"Mehrabad International Airport"},"geometry":{"type":"Point","coordinates":[51.320806971757207,35.69137433049459]}},{"type":"Feature","properties":{"type":"major","name":"Tirane Rinas","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tirana_International_Airport_N%C3%ABn%C3%AB_Tereza","comments":null,"name_en":"Tirana International Airport Nënë Tereza"},"geometry":{"type":"Point","coordinates":[19.71503240497222,41.420851468056703]}},{"type":"Feature","properties":{"type":"major","name":"General Abelardo L Rodriguez Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Abelardo_L._Rodr%C3%ADguez_International_Airport","comments":"???","name_en":"Tijuana International Airport"},"geometry":{"type":"Point","coordinates":[-116.975476095597514,32.546049913501328]}},{"type":"Feature","properties":{"type":"mid","name":"Jose Maria Morelos Y Pavon","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lic._Adolfo_L%C3%B3pez_Mateos_International_Airport","comments":"???","name_en":"Lic. Adolfo López Mateos International Airport"},"geometry":{"type":"Point","coordinates":[-99.570649446354196,19.338688042303197]}},{"type":"Feature","properties":{"type":"major","name":"Ulemiste","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tallinn_Airport","comments":null,"name_en":"Tallinn Airport"},"geometry":{"type":"Point","coordinates":[24.798964869982985,59.416501469745121]}},{"type":"Feature","properties":{"type":"major","name":"Ben Gurion","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ben_Gurion_International_Airport","comments":null,"name_en":"Ben Gurion Airport"},"geometry":{"type":"Point","coordinates":[34.870849918099523,32.000746850184434]}},{"type":"Feature","properties":{"type":"mid","name":"São Tomé Salazar","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/S%C3%A3o_Tom%C3%A9_International_Airport","comments":null,"name_en":"São Tomé International Airport"},"geometry":{"type":"Point","coordinates":[6.712821930056672,0.374744213699427]}},{"type":"Feature","properties":{"type":"mid","name":"Antananarivo Ivato","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ivato_Airport","comments":null,"name_en":"Ivato Airport"},"geometry":{"type":"Point","coordinates":[47.475354000957893,-18.799334876308173]}},{"type":"Feature","properties":{"type":"major","name":"Tampa Int'l","location":"parking","wikipedia":"http://en.wikipedia.org/wiki/Tampa_International_Airport","comments":null,"name_en":"Tampa International Airport"},"geometry":{"type":"Point","coordinates":[-82.534824252055003,27.980040085218384]}},{"type":"Feature","properties":{"type":"mid","name":"Zim Valencia","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Arturo_Michelena_International_Airport","comments":null,"name_en":"Arturo Michelena International Airport"},"geometry":{"type":"Point","coordinates":[-67.922361712187296,10.154005688397939]}},{"type":"Feature","properties":{"type":"mid","name":"Gumrak","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Volgograd_International_Airport","comments":null,"name_en":"Volgograd International Airport"},"geometry":{"type":"Point","coordinates":[44.354767968489014,48.791676465761093]}},{"type":"Feature","properties":{"type":"mid","name":"Vientiane","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Wattay_International_Airport","comments":null,"name_en":"Wattay International Airport"},"geometry":{"type":"Point","coordinates":[102.568238195727702,17.975459594832063]}},{"type":"Feature","properties":{"type":"mid","name":"Viru Viru Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Viru_Viru_International_Airport","comments":null,"name_en":"Viru Viru International Airport"},"geometry":{"type":"Point","coordinates":[-63.14038882182134,-17.647946825783897]}},{"type":"Feature","properties":{"type":"major","name":"Wellington Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Wellington_International_Airport","comments":null,"name_en":"Wellington International Airport"},"geometry":{"type":"Point","coordinates":[174.811665268237562,-41.328989184465932]}},{"type":"Feature","properties":{"type":"mid","name":"Prince Rupert","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Prince_Rupert_Airport","comments":null,"name_en":"Prince Rupert Airport"},"geometry":{"type":"Point","coordinates":[-130.445587,54.292]}},{"type":"Feature","properties":{"type":"mid","name":"Windsor","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Windsor_Airport","comments":null,"name_en":"Windsor International Airport"},"geometry":{"type":"Point","coordinates":[-82.96008773894485,42.265878472719756]}},{"type":"Feature","properties":{"type":"mid","name":"Regina","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Regina_International_Airport","comments":null,"name_en":"Regina International Airport"},"geometry":{"type":"Point","coordinates":[-104.655433975371153,50.433219286718334]}},{"type":"Feature","properties":{"type":"major","name":"Vancouver Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Vancouver_International_Airport","comments":null,"name_en":"Vancouver International Airport"},"geometry":{"type":"Point","coordinates":[-123.18086700381177,49.193559039571532]}},{"type":"Feature","properties":{"type":"major","name":"Winnipeg Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Winnipeg_James_Armstrong_Richardson_International_Airport","comments":null,"name_en":"Winnipeg James Armstrong Richardson International Airport"},"geometry":{"type":"Point","coordinates":[-97.226769480958481,49.903330247167077]}},{"type":"Feature","properties":{"type":"mid","name":"John G Diefenbaker Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Saskatoon/John_G._Diefenbaker_International_Airport","comments":null,"name_en":"Saskatoon John G. Diefenbaker International Airport"},"geometry":{"type":"Point","coordinates":[-106.69018196755394,52.170143944738115]}},{"type":"Feature","properties":{"type":"mid","name":"Whitehorse Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Whitehorse_International_Airport","comments":null,"name_en":"Erik Nielsen Whitehorse International Airport"},"geometry":{"type":"Point","coordinates":[-135.076210089401542,60.714152148139725]}},{"type":"Feature","properties":{"type":"major","name":"Calgary Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Calgary_International_Airport","comments":null,"name_en":"Calgary International Airport"},"geometry":{"type":"Point","coordinates":[-114.01056050023648,51.130857256754865]}},{"type":"Feature","properties":{"type":"mid","name":"Charlottetown","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Charlottetown_Airport","comments":null,"name_en":"Charlottetown Airport"},"geometry":{"type":"Point","coordinates":[-63.131234133323375,46.285813136752459]}},{"type":"Feature","properties":{"type":"mid","name":"Churchill","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Churchill_Airport","comments":null,"name_en":"Churchill Airport"},"geometry":{"type":"Point","coordinates":[-94.081363950631797,58.749723784978798]}},{"type":"Feature","properties":{"type":"mid","name":"St John's Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/St._John's_International_Airport","comments":null,"name_en":"St. John's International Airport"},"geometry":{"type":"Point","coordinates":[-52.743333742863804,47.613117900795451]}},{"type":"Feature","properties":{"type":"mid","name":"Yellowknife","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Yellowknife_Airport","comments":null,"name_en":"Yellowknife Airport"},"geometry":{"type":"Point","coordinates":[-114.437846335049187,62.470737361020184]}},{"type":"Feature","properties":{"type":"major","name":"Zagreb","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Zagreb_Airport","comments":null,"name_en":"Zagreb Airport"},"geometry":{"type":"Point","coordinates":[16.061513800901448,45.733326673098361]}},{"type":"Feature","properties":{"type":"mid","name":"Zanzibar","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Zanzibar_International_Airport","comments":"???","name_en":"Abeid Amani Karume International Airport"},"geometry":{"type":"Point","coordinates":[39.222331984155808,-6.218570346202824]}},{"type":"Feature","properties":{"type":"mid","name":"Reykjavik Air Terminal","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Reykjav%C3%ADk_Airport","comments":null,"name_en":"Reykjavík Airport"},"geometry":{"type":"Point","coordinates":[-21.946634403132741,64.131872860990057]}},{"type":"Feature","properties":{"type":"mid","name":"Arkhangelsk-Talagi","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Talagi_Airport","comments":null,"name_en":"Talagi Airport"},"geometry":{"type":"Point","coordinates":[40.713346569459389,64.596743773045461]}},{"type":"Feature","properties":{"type":"major","name":"Kazan Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kazan_International_Airport","comments":null,"name_en":"Kazan International Airport"},"geometry":{"type":"Point","coordinates":[49.298445803640661,55.608060142976449]}},{"type":"Feature","properties":{"type":"major","name":"Paris Orly","location":"parking","wikipedia":"http://en.wikipedia.org/wiki/Orly_Airport_(Paris)","comments":null,"name_en":"Orly Airport"},"geometry":{"type":"Point","coordinates":[2.367379127837731,48.73130304580517]}},{"type":"Feature","properties":{"type":"major","name":"Québec","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Qu%C3%A9bec/Jean_Lesage_International_Airport","comments":null,"name_en":"Québec City Jean Lesage International Airport"},"geometry":{"type":"Point","coordinates":[-71.383928071173145,46.791568436330763]}},{"type":"Feature","properties":{"type":"major","name":"Montréal-Trudeau","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Montr%C3%A9al-Pierre_Elliott_Trudeau_International_Airport","comments":null,"name_en":"Montréal–Pierre Elliott Trudeau International Airport"},"geometry":{"type":"Point","coordinates":[-73.749316265041656,45.458351229453129]}},{"type":"Feature","properties":{"type":"major","name":"Narita Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Narita_International_Airport","comments":null,"name_en":"Narita International Airport"},"geometry":{"type":"Point","coordinates":[140.384401709179087,35.764056072782786]}},{"type":"Feature","properties":{"type":"major","name":"Chubu Centrair Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ch%C5%ABbu_Centrair_International_Airport","comments":null,"name_en":"Chubu Centrair International Airport"},"geometry":{"type":"Point","coordinates":[136.814771286824282,34.859029695816233]}},{"type":"Feature","properties":{"type":"mid","name":"Okadama","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Okadama_Airport","comments":null,"name_en":"Okadama Airport"},"geometry":{"type":"Point","coordinates":[141.382100450075171,43.110649599097847]}},{"type":"Feature","properties":{"type":"major","name":"Bergen Flesland","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bergen_Airport%2C_Flesland","comments":null,"name_en":"Bergen Airport"},"geometry":{"type":"Point","coordinates":[5.227253115623363,60.289061050296588]}},{"type":"Feature","properties":{"type":"major","name":"Tromsø Langnes","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Troms%C3%B8_Airport","comments":null,"name_en":"Tromsø Airport"},"geometry":{"type":"Point","coordinates":[18.907262429213173,69.679679047347761]}},{"type":"Feature","properties":{"type":"mid","name":"Val de Caes Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Val_de_C%C3%A3es_International_Airport","comments":null,"name_en":"Val de Cans International Airport"},"geometry":{"type":"Point","coordinates":[-48.479560289379336,-1.389746287955464]}},{"type":"Feature","properties":{"type":"mid","name":"Campo Grande Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Campo_Grande_International_Airport","comments":null,"name_en":"Campo Grande International Airport"},"geometry":{"type":"Point","coordinates":[-54.668949878130512,-20.457271736031132]}},{"type":"Feature","properties":{"type":"mid","name":"Afonso Pena Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Afonso_Pena_International_Airport","comments":null,"name_en":"Afonso Pena International Airport"},"geometry":{"type":"Point","coordinates":[-49.173709366346884,-25.536000143055837]}},{"type":"Feature","properties":{"type":"mid","name":"Pinto Martins Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Pinto_Martins_International_Airport","comments":null,"name_en":"Pinto Martins – Fortaleza International Airport"},"geometry":{"type":"Point","coordinates":[-38.540747249833416,-3.778594962330909]}},{"type":"Feature","properties":{"type":"major","name":"São Paulo-Guarulhos Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/S%C3%A3o_Paulo-Guarulhos_International_Airport","comments":null,"name_en":"São Paulo-Guarulhos International Airport"},"geometry":{"type":"Point","coordinates":[-46.481753608842027,-23.426115577042061]}},{"type":"Feature","properties":{"type":"mid","name":"Santa Genoveva","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Santa_Genoveva_Airport","comments":null,"name_en":"Santa Genoveva Airport"},"geometry":{"type":"Point","coordinates":[-49.226646490599357,-16.632366572163658]}},{"type":"Feature","properties":{"type":"mid","name":"Salgado Filho Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Salgado_Filho_International_Airport","comments":null,"name_en":"Salgado Filho International Airport"},"geometry":{"type":"Point","coordinates":[-51.177040948817243,-29.990193017060918]}},{"type":"Feature","properties":{"type":"mid","name":"Gilberto Freyre Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Guararapes_International_Airport","comments":null,"name_en":"Recife/Guararapes–Gilberto Freyre International Airport"},"geometry":{"type":"Point","coordinates":[-34.918266717485139,-8.131625530762387]}},{"type":"Feature","properties":{"type":"mid","name":"Deputado Luis Eduardo Magalhaes Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Deputado_Lu%C3%ADs_Eduardo_Magalh%C3%A3es_International_Airport","comments":null,"name_en":"Deputado Luís Eduardo Magalhães International Airport"},"geometry":{"type":"Point","coordinates":[-38.334798991173201,-12.914361497032587]}},{"type":"Feature","properties":{"type":"mid","name":"El Plumerillo","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Governor_Francisco_Gabrielli_International_Airport","comments":null,"name_en":"Governor Francisco Gabrielli International Airport"},"geometry":{"type":"Point","coordinates":[-68.798483839447272,-32.827800169271931]}},{"type":"Feature","properties":{"type":"mid","name":"Eduardo Gomes Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Eduardo_Gomes_International_Airport","comments":null,"name_en":"Manaus International Airport"},"geometry":{"type":"Point","coordinates":[-60.046064589885383,-3.032139006259097]}},{"type":"Feature","properties":{"type":"mid","name":"Yaoundé Nsimalen Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Yaound%C3%A9_Nsimalen_International_Airport","comments":null,"name_en":"Yaoundé Nsimalen International Airport"},"geometry":{"type":"Point","coordinates":[11.547994139680723,3.714845207081258]}},{"type":"Feature","properties":{"type":"major","name":"Shanghai Pudong Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Shanghai_Pudong_International_Airport","comments":null,"name_en":"Shanghai Pudong International Airport"},"geometry":{"type":"Point","coordinates":[121.801518760578475,31.152309029553294]}},{"type":"Feature","properties":{"type":"mid","name":"Marka Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Marka_Airport","comments":null,"name_en":"Amman Civil Airport"},"geometry":{"type":"Point","coordinates":[35.984105236244915,31.974199401544169]}},{"type":"Feature","properties":{"type":"major","name":"Male Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mal%C3%A9_International_Airport","comments":null,"name_en":"Velana International Airport"},"geometry":{"type":"Point","coordinates":[73.527390283684412,4.188700903233721]}},{"type":"Feature","properties":{"type":"mid","name":"Gen. Heriberto Jara Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/General_Heriberto_Jara_International_Airport","comments":null,"name_en":"General Heriberto Jara International Airport"},"geometry":{"type":"Point","coordinates":[-96.183570214369482,19.142423702501713]}},{"type":"Feature","properties":{"type":"mid","name":"Osvaldo Vieira Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Osvaldo_Vieira_International_Airport","comments":null,"name_en":"Osvaldo Vieira International Airport"},"geometry":{"type":"Point","coordinates":[-15.651185561666004,11.888923145485485]}},{"type":"Feature","properties":{"type":"major","name":"Francisco Bangoy Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Francisco_Bangoy_International_Airport","comments":null,"name_en":"Francisco Bangoy International Airport"},"geometry":{"type":"Point","coordinates":[125.645066609433812,7.130537461630729]}},{"type":"Feature","properties":{"type":"mid","name":"Seychelles Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Seychelles_International_Airport","comments":null,"name_en":"Seychelles International Airport"},"geometry":{"type":"Point","coordinates":[55.511551924679317,-4.671069141785209]}},{"type":"Feature","properties":{"type":"major","name":"Léopold Sedar Senghor Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dakar-Yoff-L%C3%A9opold_S%C3%A9dar_Senghor_International_Airport","comments":null,"name_en":"Léopold Sédar Senghor International Airport"},"geometry":{"type":"Point","coordinates":[-17.490407907719003,14.745630614674791]}},{"type":"Feature","properties":{"type":"mid","name":"Port Sudan New Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Port_Sudan_New_International_Airport","comments":null,"name_en":"Port Sudan New International Airport"},"geometry":{"type":"Point","coordinates":[37.238747598102471,19.434105238523106]}},{"type":"Feature","properties":{"type":"major","name":"Tashkent Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Tashkent_International_Airport","comments":null,"name_en":"Tashkent International Airport"},"geometry":{"type":"Point","coordinates":[69.266613724112929,41.262233876738293]}},{"type":"Feature","properties":{"type":"major","name":"Copenhagen","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Copenhagen_Airport","comments":null,"name_en":"Copenhagen Airport"},"geometry":{"type":"Point","coordinates":[12.649350868450769,55.628501722152784]}},{"type":"Feature","properties":{"type":"mid","name":"Aeroportul National Bucuresti-Baneasa","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Aurel_Vlaicu_International_Airport","comments":null,"name_en":"Aurel Vlaicu International Airport"},"geometry":{"type":"Point","coordinates":[26.085725158776373,44.497041455972031]}},{"type":"Feature","properties":{"type":"major","name":"Ferihegy","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Budapest_Ferihegy_International_Airport","comments":null,"name_en":"Budapest Ferenc Liszt International Airport"},"geometry":{"type":"Point","coordinates":[19.262230167788079,47.433274269247953]}},{"type":"Feature","properties":{"type":"major","name":"Chongqing Jiangbei Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chongqing_Jiangbei_International_Airport","comments":null,"name_en":"Chongqing Jiangbei International Airport"},"geometry":{"type":"Point","coordinates":[106.638019704810958,29.724042224168777]}},{"type":"Feature","properties":{"type":"major","name":"Douglas Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Charlotte/Douglas_International_Airport","comments":null,"name_en":"Charlotte/Douglas International Airport"},"geometry":{"type":"Point","coordinates":[-80.943927734276258,35.220428168559714]}},{"type":"Feature","properties":{"type":"major","name":"Detroit Metro","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Detroit_Metropolitan_Wayne_County_Airport","comments":null,"name_en":"Detroit Metropolitan Wayne County Airport"},"geometry":{"type":"Point","coordinates":[-83.347893506561505,42.225720450800409]}},{"type":"Feature","properties":{"type":"major","name":"Dublin","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dublin_Airport","comments":null,"name_en":"Dublin Airport"},"geometry":{"type":"Point","coordinates":[-6.243884910371394,53.427008284970043]}},{"type":"Feature","properties":{"type":"major","name":"Fairbanks Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Fairbanks_International_Airport","comments":null,"name_en":"Fairbanks International Airport"},"geometry":{"type":"Point","coordinates":[-147.865721120795172,64.818098111736916]}},{"type":"Feature","properties":{"type":"major","name":"Hamburg","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hamburg_Airport","comments":null,"name_en":"Hamburg Airport"},"geometry":{"type":"Point","coordinates":[10.005647830925001,53.632001164086581]}},{"type":"Feature","properties":{"type":"major","name":"Kuala Lumpur Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kuala_Lumpur_International_Airport","comments":null,"name_en":"Kuala Lumpur International Airport"},"geometry":{"type":"Point","coordinates":[101.713886325742735,2.747512957918107]}},{"type":"Feature","properties":{"type":"major","name":"Mccarran Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/McCarran_International_Airport","comments":null,"name_en":"McCarran International Airport"},"geometry":{"type":"Point","coordinates":[-115.151323951283317,36.084960238336741]}},{"type":"Feature","properties":{"type":"major","name":"Orlando Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Orlando_International_Airport","comments":null,"name_en":"Orlando International Airport"},"geometry":{"type":"Point","coordinates":[-81.307371330798489,28.431150679113763]}},{"type":"Feature","properties":{"type":"major","name":"Minneapolis St. Paul Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Minneapolis-Saint_Paul_International_Airport","comments":null,"name_en":"Minneapolis–Saint Paul International Airport"},"geometry":{"type":"Point","coordinates":[-93.208100371830085,44.882026363196815]}},{"type":"Feature","properties":{"type":"major","name":"Franz-Josef-Strauss","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Munich_International_Airport","comments":null,"name_en":"Munich Airport"},"geometry":{"type":"Point","coordinates":[11.788062719243687,48.353837396160849]}},{"type":"Feature","properties":{"type":"major","name":"Philadelphia Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Philadelphia_International_Airport","comments":null,"name_en":"Philadelphia International Airport"},"geometry":{"type":"Point","coordinates":[-75.242985767699807,39.876087236426997]}},{"type":"Feature","properties":{"type":"major","name":"Sky Harbor Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Phoenix_Sky_Harbor_International_Airport","comments":null,"name_en":"Phoenix Sky Harbor International Airport"},"geometry":{"type":"Point","coordinates":[-112.01363529772982,33.435860763949769]}},{"type":"Feature","properties":{"type":"major","name":"Salt Lake City Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Salt_Lake_City_International_Airport","comments":null,"name_en":"Salt Lake City International Airport"},"geometry":{"type":"Point","coordinates":[-111.981984879992709,40.786729005370844]}},{"type":"Feature","properties":{"type":"major","name":"Lambert St Louis Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lambert-St._Louis_International_Airport","comments":null,"name_en":"Lambert–St. Louis International Airport"},"geometry":{"type":"Point","coordinates":[-90.365954535067473,38.742716315520354]}},{"type":"Feature","properties":{"type":"major","name":"Okecie Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Warsaw_Frederic_Chopin_Airport","comments":null,"name_en":"Warsaw Chopin Airport"},"geometry":{"type":"Point","coordinates":[20.972726338358651,52.171026749259035]}},{"type":"Feature","properties":{"type":"major","name":"Zurich Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Z%C3%BCrich_Airport","comments":null,"name_en":"Zurich Airport"},"geometry":{"type":"Point","coordinates":[8.562212795347646,47.452389506491549]}},{"type":"Feature","properties":{"type":"mid","name":"Gosselies","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Brussels_South_Charleroi_Airport","comments":null,"name_en":"Brussels South Charleroi Airport"},"geometry":{"type":"Point","coordinates":[4.454373629816502,50.457129654956681]}},{"type":"Feature","properties":{"type":"major","name":"Munich Freight Terminal","location":"freight","wikipedia":"http://en.wikipedia.org/wiki/Munich_Airport","comments":null,"name_en":"Munich Airport"},"geometry":{"type":"Point","coordinates":[11.769482859365427,48.349796407837665]}},{"type":"Feature","properties":{"type":"major","name":"Barcelona","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Barcelona_International_Airport","comments":null,"name_en":"Josep Tarradellas Airport Barcelona-El Prat"},"geometry":{"type":"Point","coordinates":[2.078003349812917,41.303155279746342]}},{"type":"Feature","properties":{"type":"major","name":"Ruzyn","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ruzyn%C4%9B_International_Airport","comments":null,"name_en":"Prague Václav Havel Airport"},"geometry":{"type":"Point","coordinates":[14.267484985407632,50.107651170367141]}},{"type":"Feature","properties":{"type":"major","name":"Hong Kong Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hong_Kong_International_Airport","comments":null,"name_en":"Hong Kong International Airport"},"geometry":{"type":"Point","coordinates":[113.935016387376351,22.315332828086753]}},{"type":"Feature","properties":{"type":"major","name":"Taoyuan","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Taiwan_Taoyuan_International_Airport","comments":null,"name_en":"Taoyuan International Airport"},"geometry":{"type":"Point","coordinates":[121.231370453323265,25.076741104334637]}},{"type":"Feature","properties":{"type":"major","name":"Schiphol","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Amsterdam_Schiphol_Airport","comments":null,"name_en":"Amsterdam Airport Schiphol"},"geometry":{"type":"Point","coordinates":[4.764376932328117,52.308932388982171]}},{"type":"Feature","properties":{"type":"major","name":"Singapore Changi","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Singapore_Changi_Airport","comments":null,"name_en":"Singapore Changi Airport"},"geometry":{"type":"Point","coordinates":[103.986413880993325,1.356160835281264]}},{"type":"Feature","properties":{"type":"major","name":"London Heathrow","location":"parking","wikipedia":"http://en.wikipedia.org/wiki/London_Heathrow_Airport","comments":null,"name_en":"Heathrow Airport"},"geometry":{"type":"Point","coordinates":[-0.453156652063309,51.470995879993843]}},{"type":"Feature","properties":{"type":"major","name":"Auckland Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Auckland_International_Airport","comments":null,"name_en":"Auckland Airport"},"geometry":{"type":"Point","coordinates":[174.791719433715173,-37.006355114281462]}},{"type":"Feature","properties":{"type":"major","name":"Anchorage Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Lake_Hood_Seaplane_Base","comments":"ok","name_en":"Ted Stevens Anchorage International Airport"},"geometry":{"type":"Point","coordinates":[-149.981725100632787,61.172893674536688]}},{"type":"Feature","properties":{"type":"major","name":"Hartsfield-Jackson Atlanta Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Hartsfield-Jackson_Atlanta_International_Airport","comments":null,"name_en":"Hartsfield–Jackson Atlanta International Airport"},"geometry":{"type":"Point","coordinates":[-84.425397433604729,33.640529080735213]}},{"type":"Feature","properties":{"type":"major","name":"Beijing Capital","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Beijing_Capital_International_Airport","comments":null,"name_en":"Beijing Capital International Airport"},"geometry":{"type":"Point","coordinates":[116.588174004661028,40.078766336331022]}},{"type":"Feature","properties":{"type":"major","name":"Eldorado Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/El_Dorado_International_Airport","comments":null,"name_en":"El Dorado International Airport Luis Carlos Galán Sarmiento"},"geometry":{"type":"Point","coordinates":[-74.143371800102784,4.69883276192097]}},{"type":"Feature","properties":{"type":"major","name":"Chhatrapati Shivaji Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chhatrapati_Shivaji_International_Airport","comments":null,"name_en":"Chhatrapati Shivaji Maharaj International Airport"},"geometry":{"type":"Point","coordinates":[72.874563950005083,19.095101948840245]}},{"type":"Feature","properties":{"type":"major","name":"Gen E L Logan Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Logan_International_Airport","comments":null,"name_en":"Logan International Airport"},"geometry":{"type":"Point","coordinates":[-71.016406617295843,42.366565819850564]}},{"type":"Feature","properties":{"type":"major","name":"Baltimore-Washington Int'l Thurgood Marshall","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Baltimore-Washington_International_Thurgood_Marshall_Airport","comments":null,"name_en":"Baltimore/Washington International Thurgood Marshall Airport"},"geometry":{"type":"Point","coordinates":[-76.66864283524481,39.179394358356781]}},{"type":"Feature","properties":{"type":"major","name":"Cairo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cairo_International_Airport","comments":null,"name_en":"Cairo International Airport"},"geometry":{"type":"Point","coordinates":[31.399743006711368,30.111990438557491]}},{"type":"Feature","properties":{"type":"mid","name":"Casablanca-Anfa","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Casablanca-Anfa_Airport","comments":null,"name_en":"Casablanca-Anfa Airport"},"geometry":{"type":"Point","coordinates":[-7.663218807711428,33.562788385107879]}},{"type":"Feature","properties":{"type":"mid","name":"Simón Bolivar Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sim%C3%B3n_Bol%C3%ADvar_International_Airport","comments":null,"name_en":"Simón Bolívar International Airport"},"geometry":{"type":"Point","coordinates":[-67.005748807631647,10.597354914606406]}},{"type":"Feature","properties":{"type":"major","name":"Cape Town Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Cape_Town_International_Airport","comments":null,"name_en":"Cape Town International Airport"},"geometry":{"type":"Point","coordinates":[18.597656508313793,-33.970446612039538]}},{"type":"Feature","properties":{"type":"major","name":"Chengdushuang Liu","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Chengdu_Shuangliu_International_Airport","comments":null,"name_en":"Chengdu Shuangliu International Airport"},"geometry":{"type":"Point","coordinates":[103.956136481695012,30.581071264746427]}},{"type":"Feature","properties":{"type":"major","name":"Indira Gandhi Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Indira_Gandhi_International_Airport","comments":null,"name_en":"Indira Gandhi International Airport"},"geometry":{"type":"Point","coordinates":[77.087836256533194,28.559203976058605]}},{"type":"Feature","properties":{"type":"major","name":"Denver Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Denver_International_Airport","comments":null,"name_en":"Denver International Airport"},"geometry":{"type":"Point","coordinates":[-104.673797338541974,39.849461388150949]}},{"type":"Feature","properties":{"type":"major","name":"Dallas-Ft. Worth Int'l","location":"parking","wikipedia":"http://en.wikipedia.org/wiki/Dallas-Fort_Worth_International_Airport","comments":null,"name_en":"Dallas/Fort Worth International Airport"},"geometry":{"type":"Point","coordinates":[-97.040371074114418,32.900150559481553]}},{"type":"Feature","properties":{"type":"major","name":"Don Muang Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Don_Mueang_International_Airport","comments":null,"name_en":"Don Mueang International Airport"},"geometry":{"type":"Point","coordinates":[100.602578626505135,13.920276601034733]}},{"type":"Feature","properties":{"type":"major","name":"Dubai Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Dubai_International_Airport","comments":null,"name_en":"Dubai International Airport"},"geometry":{"type":"Point","coordinates":[55.35407691722429,25.252565593818161]}},{"type":"Feature","properties":{"type":"major","name":"Newark Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Newark_Liberty_International_Airport","comments":null,"name_en":"Newark Liberty International Airport"},"geometry":{"type":"Point","coordinates":[-74.177147279670606,40.690479827892922]}},{"type":"Feature","properties":{"type":"major","name":"Ministro Pistarini Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ministro_Pistarini_International_Airport","comments":null,"name_en":"Ministro Pistarini International Airport"},"geometry":{"type":"Point","coordinates":[-58.541245693938222,-34.813646938032321]}},{"type":"Feature","properties":{"type":"major","name":"Fort Lauderdale Hollywood Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Fort_Lauderdale-Hollywood_International_Airport","comments":null,"name_en":"Fort Lauderdale–Hollywood International Airport"},"geometry":{"type":"Point","coordinates":[-80.145258846518914,26.071709574682728]}},{"type":"Feature","properties":{"type":"major","name":"George Bush Intercontinental","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/George_Bush_Intercontinental_Airport","comments":null,"name_en":"George Bush Intercontinental Airport"},"geometry":{"type":"Point","coordinates":[-95.333704791294664,29.986590903490701]}},{"type":"Feature","properties":{"type":"major","name":"Atatürk Hava Limani","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Atat%C3%BCrk_International_Airport","comments":"???","name_en":"Atatürk International Airport"},"geometry":{"type":"Point","coordinates":[28.819549308789298,40.977838817779705]}},{"type":"Feature","properties":{"type":"major","name":"OR Tambo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/OR_Tambo_International_Airport","comments":null,"name_en":"OR Tambo International Airport"},"geometry":{"type":"Point","coordinates":[28.231988564874079,-26.132095399488719]}},{"type":"Feature","properties":{"type":"mid","name":"Juneau Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Juneau_International_Airport","comments":null,"name_en":"Juneau International Airport"},"geometry":{"type":"Point","coordinates":[-134.583573037872412,58.358944104595075]}},{"type":"Feature","properties":{"type":"major","name":"Los Angeles Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Los_Angeles_International_Airport","comments":null,"name_en":"Los Angeles International Airport"},"geometry":{"type":"Point","coordinates":[-118.402468548521981,33.944174254358572]}},{"type":"Feature","properties":{"type":"major","name":"Linate","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Linate_Airport","comments":null,"name_en":"Linate Airport"},"geometry":{"type":"Point","coordinates":[9.279966296910612,45.460393845625219]}},{"type":"Feature","properties":{"type":"major","name":"Melbourne Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Melbourne_Airport","comments":null,"name_en":"Melbourne Airport"},"geometry":{"type":"Point","coordinates":[144.84899809113125,-37.669941196789267]}},{"type":"Feature","properties":{"type":"major","name":"Lic Benito Juarez Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Mexico_City_International_Airport","comments":null,"name_en":"Mexico City International Airport"},"geometry":{"type":"Point","coordinates":[-99.082607951423924,19.435469572049442]}},{"type":"Feature","properties":{"type":"major","name":"Ninoy Aquino Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Ninoy_Aquino_International_Airport","comments":null,"name_en":"Ninoy Aquino International Airport"},"geometry":{"type":"Point","coordinates":[121.004122083437466,14.506832376296721]}},{"type":"Feature","properties":{"type":"major","name":"Jomo Kenyatta Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Jomo_Kenyatta_International_Airport","comments":null,"name_en":"Jomo Kenyatta International Airport"},"geometry":{"type":"Point","coordinates":[36.925088749036547,-1.330529643506341]}},{"type":"Feature","properties":{"type":"major","name":"Honolulu Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Honolulu_International_Airport","comments":null,"name_en":"Daniel K. Inouye International Airport"},"geometry":{"type":"Point","coordinates":[-157.919783173754752,21.332022315023991]}},{"type":"Feature","properties":{"type":"major","name":"Chicago O'Hare Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/O'Hare_International_Airport","comments":null,"name_en":"O'Hare International Airport"},"geometry":{"type":"Point","coordinates":[-87.905134390650034,41.976529102380312]}},{"type":"Feature","properties":{"type":"major","name":"King Khalid Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/King_Khalid_International_Airport","comments":null,"name_en":"King Khalid International Airport"},"geometry":{"type":"Point","coordinates":[46.701829023464015,24.959031743651174]}},{"type":"Feature","properties":{"type":"major","name":"Arturo Merino Benitez Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Comodoro_Arturo_Merino_Ben%C3%ADtez_International_Airport","comments":null,"name_en":"Arturo Merino Benítez International Airport"},"geometry":{"type":"Point","coordinates":[-70.793686016297414,-33.396833634259714]}},{"type":"Feature","properties":{"type":"major","name":"Seattle-Tacoma Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Seattle-Tacoma_International_Airport","comments":"???","name_en":"Seattle–Tacoma International Airport"},"geometry":{"type":"Point","coordinates":[-122.302289722923874,47.443581912725911]}},{"type":"Feature","properties":{"type":"major","name":"San Francisco Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/San_Francisco_International_Airport","comments":null,"name_en":"San Francisco International Airport"},"geometry":{"type":"Point","coordinates":[-122.38347034444935,37.617025086805349]}},{"type":"Feature","properties":{"type":"major","name":"Hongqiao","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Shanghai_Hongqiao_International_Airport","comments":null,"name_en":"Shanghai Hongqiao International Airport"},"geometry":{"type":"Point","coordinates":[121.341183788567136,31.187257431407843]}},{"type":"Feature","properties":{"type":"major","name":"Sheremtyevo","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Sheremetyevo_International_Airport","comments":null,"name_en":"Sheremetyevo International Airport"},"geometry":{"type":"Point","coordinates":[37.415969034841353,55.966447172511991]}},{"type":"Feature","properties":{"type":"major","name":"Toronto-Pearson Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Toronto_Pearson_International_Airport","comments":null,"name_en":"Toronto Pearson International Airport"},"geometry":{"type":"Point","coordinates":[-79.611419324744858,43.680959518635639]}},{"type":"Feature","properties":{"type":"major","name":"Kingsford Smith","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Kingsford_Smith_International_Airport","comments":null,"name_en":"Sydney Airport"},"geometry":{"type":"Point","coordinates":[151.166067305601018,-33.936583205771655]}},{"type":"Feature","properties":{"type":"major","name":"Helsinki Vantaa","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Helsinki-Vantaa_Airport","comments":null,"name_en":"Helsinki Airport"},"geometry":{"type":"Point","coordinates":[24.968207866591406,60.318715891298211]}},{"type":"Feature","properties":{"type":"major","name":"Charles de Gaulle Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Charles_de_Gaulle_International_Airport","comments":null,"name_en":"Paris-Charles de Gaulle Airport"},"geometry":{"type":"Point","coordinates":[2.541867767394573,49.014420096938551]}},{"type":"Feature","properties":{"type":"major","name":"Berlin-Tegel Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Berlin-Tegel_International_Airport","comments":null,"name_en":"Berlin Tegel Airport"},"geometry":{"type":"Point","coordinates":[13.2903090925074,52.554428704410093]}},{"type":"Feature","properties":{"type":"major","name":"Vienna Schwechat Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Vienna_International_Airport","comments":null,"name_en":"Wien-Schwechat Airport"},"geometry":{"type":"Point","coordinates":[16.560767964212864,48.119756305253766]}},{"type":"Feature","properties":{"type":"major","name":"Frankfurt Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Frankfurt_Airport","comments":null,"name_en":"Frankfurt Airport"},"geometry":{"type":"Point","coordinates":[8.571822869076076,50.05067708952074]}},{"type":"Feature","properties":{"type":"major","name":"Leonardo da Vinci Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Leonardo_da_Vinci_Airport","comments":null,"name_en":"Leonardo da Vinci–Fiumicino Airport"},"geometry":{"type":"Point","coordinates":[12.250100897363827,41.795078630739425]}},{"type":"Feature","properties":{"type":"major","name":"Osaka Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Osaka_International_Airport","comments":null,"name_en":"Osaka International Airport"},"geometry":{"type":"Point","coordinates":[135.442475256249395,34.790198084874866]}},{"type":"Feature","properties":{"type":"major","name":"Gimpo Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gimpo_International_Airport","comments":null,"name_en":"Gimpo International Airport"},"geometry":{"type":"Point","coordinates":[126.802392860275845,37.557300539950781]}},{"type":"Feature","properties":{"type":"major","name":"Oslo Gardermoen","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Gardermoen_Air_Station","comments":null,"name_en":"Oslo Airport"},"geometry":{"type":"Point","coordinates":[11.099103276258118,60.193578317138616]}},{"type":"Feature","properties":{"type":"major","name":"Juscelino Kubitschek Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Bras%C3%ADlia_International_Airport","comments":"???","name_en":"Brasília International Airport"},"geometry":{"type":"Point","coordinates":[-47.920788513362538,-15.869998500282428]}},{"type":"Feature","properties":{"type":"major","name":"Congonhas Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Congonhas-S%C3%A3o_Paulo_International_Airport","comments":null,"name_en":"Congonhas-São Paulo Airport"},"geometry":{"type":"Point","coordinates":[-46.659115530219566,-23.626858827009997]}},{"type":"Feature","properties":{"type":"major","name":"Rio de Janeiro-Antonio Carlos Jobim Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Rio_de_Janeiro-Gale%C3%A3o_International_Airport","comments":"???","name_en":"Rio de Janeiro/Galeão – Antonio Carlos Jobim International Airport"},"geometry":{"type":"Point","coordinates":[-43.248381379068306,-22.812343712500642]}},{"type":"Feature","properties":{"type":"major","name":"Madrid Barajas","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Madrid_Barajas_International_Airport","comments":null,"name_en":"Adolfo Suarez Madrid-Barajas Airport"},"geometry":{"type":"Point","coordinates":[-3.569026654588628,40.468128273392253]}},{"type":"Feature","properties":{"type":"major","name":"Luis Muñoz Marin","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Luis_Mu%C3%B1oz_Mar%C3%ADn_International_Airport","comments":null,"name_en":"Luis Muñoz Marín International Airport"},"geometry":{"type":"Point","coordinates":[-66.004229975754754,18.438077073494931]}},{"type":"Feature","properties":{"type":"major","name":"Arlanda","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Stockholm-Arlanda_Airport","comments":null,"name_en":"Stockholm Arlanda Airport"},"geometry":{"type":"Point","coordinates":[17.930729901691585,59.651120339737211]}},{"type":"Feature","properties":{"type":"major","name":"Soekarno-Hatta Int'l","location":"parking","wikipedia":"http://en.wikipedia.org/wiki/Soekarno-Hatta_International_Airport","comments":null,"name_en":"Soekarno–Hatta International Airport"},"geometry":{"type":"Point","coordinates":[106.654296151171636,-6.126602955972902]}},{"type":"Feature","properties":{"type":"major","name":"Eleftherios Venizelos Int'l","location":"terminal","wikipedia":"http://en.wikipedia.org/wiki/Athens_International_Airport","comments":"???","name_en":"Athens International Airport"},"geometry":{"type":"Point","coordinates":[23.94711605540731,37.93623312992537]}},{"type":"Feature","properties":{"type":"major","name":"Tokyo Int'l","location":"terminal","wikipedia":"https://en.wikipedia.org/wiki/Haneda_Airport","comments":"aka Haneda Airport","name_en":"Tokyo International Airport"},"geometry":{"type":"Point","coordinates":[139.784046429629086,35.54906083194637]}},{"type":"Feature","properties":{"type":"major","name":"Suvarnabhumi Airport","location":"terminal","wikipedia":"https://en.wikipedia.org/wiki/Suvarnabhumi_Airport","comments":"aka Bangkok Airport","name_en":"Suvarnabhumi Airport"},"geometry":{"type":"Point","coordinates":[100.750910201106493,13.692611677022558]}}]} \ No newline at end of file diff --git a/images/loader.gif b/images/loader.gif new file mode 100644 index 0000000..d3ef195 Binary files /dev/null and b/images/loader.gif differ diff --git a/images/search-icon.png b/images/search-icon.png new file mode 100644 index 0000000..4d71130 Binary files /dev/null and b/images/search-icon.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..ab293af --- /dev/null +++ b/index.html @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + diff --git a/js/Autolinker.min.js b/js/Autolinker.min.js new file mode 100644 index 0000000..23f20b2 --- /dev/null +++ b/js/Autolinker.min.js @@ -0,0 +1,11 @@ +/*! + * Autolinker.js + * 3.11.1 + * + * Copyright(c) 2019 Gregory Jacobs + * MIT License + * + * https://github.com/gregjacobs/Autolinker.js + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Autolinker=t()}(this,function(){"use strict";function s(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var u=0,n=e.length;u",this.getInnerHtml(),""].join("")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var e=this.getAttrs(),t=[];for(var u in e)e.hasOwnProperty(u)&&t.push(u+'="'+e[u]+'"');return t.join(" ")},e}();var r=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||""}return e.prototype.build=function(e){return new u({tagName:"a",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},u=this.createCssClass(e);return u&&(t.class=u),this.newWindow&&(t.target="_blank",t.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length=h)return l.host.length==t?(l.host.substr(0,t-n)+i).substr(0,h+u):a(g,h).substr(0,h+u);var f="";if(l.path&&(f+="/"+l.path),l.query&&(f+="?"+l.query),f){if(h<=(g+f).length)return(g+f).length==t?(g+f).substr(0,t):(g+a(f,h-g.length)).substr(0,h+u);g+=f}if(l.fragment){var d="#"+l.fragment;if(h<=(g+d).length)return(g+d).length==t?(g+d).substr(0,t):(g+a(d,h-g.length)).substr(0,h+u);g+=d}if(l.scheme&&l.host){var m=l.scheme+"://";if((g+m).lengthr&&(i=null==a?(a="…",3):a.length,n=n.substring(0,r-i)+a),n)},e}(),e=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText="",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var u in t)t.hasOwnProperty(u)&&(e[u]=t[u])})(e,t)};function a(e,t){function u(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(u.prototype=t.prototype,new u)}var _=function(){return(_=Object.assign||function(e){for(var t,u=1,n=arguments.length;u"===e?(g=new V(_({},g,{name:H()})),O()):W.test(e)||I.test(e)||":"===e||N()}function b(e){">"===e?N():W.test(e)?l=3:N()}function x(e){L.test(e)||("/"===e?l=12:">"===e?O():"<"===e?S():"="===e||$.test(e)||Z.test(e)?N():l=5)}function y(e){L.test(e)?l=6:"/"===e?l=12:"="===e?l=7:">"===e?O():"<"===e?S():$.test(e)&&N()}function F(e){L.test(e)||("/"===e?l=12:"="===e?l=7:">"===e?O():"<"===e?S():$.test(e)?N():l=5)}function v(e){L.test(e)||('"'===e?l=8:"'"===e?l=9:/[>=`]/.test(e)?N():"<"===e?S():l=10)}function w(e){'"'===e&&(l=11)}function B(e){"'"===e&&(l=11)}function C(e){L.test(e)?l=4:">"===e?O():"<"===e&&S()}function D(e){L.test(e)?l=4:"/"===e?l=12:">"===e?O():"<"===e?S():(l=4,c--)}function E(e){">"===e?(g=new V(_({},g,{isClosing:!0})),O()):l=4}function k(e){"--"===t.substr(c,2)?(c+=2,g=new V(_({},g,{type:"comment"})),l=14):"DOCTYPE"===t.substr(c,7).toUpperCase()?(c+=7,g=new V(_({},g,{type:"doctype"})),l=20):N()}function T(e){"-"===e?l=15:">"===e?N():l=16}function M(e){"-"===e?l=18:">"===e?N():l=16}function P(e){"-"===e&&(l=17)}function j(e){l="-"===e?18:16}function z(e){">"===e?O():"!"===e?l=19:"-"===e||(l=16)}function R(e){"-"===e?l=17:">"===e?O():l=16}function q(e){">"===e?O():"<"===e&&S()}function N(){l=0,g=o}function S(){l=1,g=new V({idx:c})}function O(){var e=t.slice(p,g.idx);e&&a(e,p),"comment"===g.type?i(g.idx):"doctype"===g.type?s(g.idx):(g.isOpening&&n(g.name,g.idx),g.isClosing&&r(g.name,g.idx)),N(),p=c+1}function H(){var e=g.idx+(g.isClosing?2:1);return t.slice(e,c).toLowerCase()}pr?t:t+1;e.splice(i,1);continue}e[t+1].getOffset() -1 + }; + } + + function normalizeName(name) { + if (typeof name !== 'string') { + name = String(name); + } + if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { + throw new TypeError('Invalid character in header field name') + } + return name.toLowerCase() + } + + function normalizeValue(value) { + if (typeof value !== 'string') { + value = String(value); + } + return value + } + + // Build a destructive iterator for the value list + function iteratorFor(items) { + var iterator = { + next: function() { + var value = items.shift(); + return {done: value === undefined, value: value} + } + }; + + if (support.iterable) { + iterator[Symbol.iterator] = function() { + return iterator + }; + } + + return iterator + } + + function Headers(headers) { + this.map = {}; + + if (headers instanceof Headers) { + headers.forEach(function(value, name) { + this.append(name, value); + }, this); + } else if (Array.isArray(headers)) { + headers.forEach(function(header) { + this.append(header[0], header[1]); + }, this); + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function(name) { + this.append(name, headers[name]); + }, this); + } + } + + Headers.prototype.append = function(name, value) { + name = normalizeName(name); + value = normalizeValue(value); + var oldValue = this.map[name]; + this.map[name] = oldValue ? oldValue+','+value : value; + }; + + Headers.prototype['delete'] = function(name) { + delete this.map[normalizeName(name)]; + }; + + Headers.prototype.get = function(name) { + name = normalizeName(name); + return this.has(name) ? this.map[name] : null + }; + + Headers.prototype.has = function(name) { + return this.map.hasOwnProperty(normalizeName(name)) + }; + + Headers.prototype.set = function(name, value) { + this.map[normalizeName(name)] = normalizeValue(value); + }; + + Headers.prototype.forEach = function(callback, thisArg) { + var this$1 = this; + + for (var name in this.map) { + if (this$1.map.hasOwnProperty(name)) { + callback.call(thisArg, this$1.map[name], name, this$1); + } + } + }; + + Headers.prototype.keys = function() { + var items = []; + this.forEach(function(value, name) { items.push(name); }); + return iteratorFor(items) + }; + + Headers.prototype.values = function() { + var items = []; + this.forEach(function(value) { items.push(value); }); + return iteratorFor(items) + }; + + Headers.prototype.entries = function() { + var items = []; + this.forEach(function(value, name) { items.push([name, value]); }); + return iteratorFor(items) + }; + + if (support.iterable) { + Headers.prototype[Symbol.iterator] = Headers.prototype.entries; + } + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError('Already read')) + } + body.bodyUsed = true; + } + + function fileReaderReady(reader) { + return new Promise(function(resolve, reject) { + reader.onload = function() { + resolve(reader.result); + }; + reader.onerror = function() { + reject(reader.error); + }; + }) + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader(); + var promise = fileReaderReady(reader); + reader.readAsArrayBuffer(blob); + return promise + } + + function readBlobAsText(blob) { + var reader = new FileReader(); + var promise = fileReaderReady(reader); + reader.readAsText(blob); + return promise + } + + function readArrayBufferAsText(buf) { + var view = new Uint8Array(buf); + var chars = new Array(view.length); + + for (var i = 0; i < view.length; i++) { + chars[i] = String.fromCharCode(view[i]); + } + return chars.join('') + } + + function bufferClone(buf) { + if (buf.slice) { + return buf.slice(0) + } else { + var view = new Uint8Array(buf.byteLength); + view.set(new Uint8Array(buf)); + return view.buffer + } + } + + function Body() { + this.bodyUsed = false; + + this._initBody = function(body) { + this._bodyInit = body; + if (!body) { + this._bodyText = ''; + } else if (typeof body === 'string') { + this._bodyText = body; + } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { + this._bodyBlob = body; + } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { + this._bodyFormData = body; + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this._bodyText = body.toString(); + } else if (support.arrayBuffer && support.blob && isDataView(body)) { + this._bodyArrayBuffer = bufferClone(body.buffer); + // IE 10-11 can't handle a DataView body. + this._bodyInit = new Blob([this._bodyArrayBuffer]); + } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { + this._bodyArrayBuffer = bufferClone(body); + } else { + throw new Error('unsupported BodyInit type') + } + + if (!this.headers.get('content-type')) { + if (typeof body === 'string') { + this.headers.set('content-type', 'text/plain;charset=UTF-8'); + } else if (this._bodyBlob && this._bodyBlob.type) { + this.headers.set('content-type', this._bodyBlob.type); + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); + } + } + }; + + if (support.blob) { + this.blob = function() { + var rejected = consumed(this); + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return Promise.resolve(this._bodyBlob) + } else if (this._bodyArrayBuffer) { + return Promise.resolve(new Blob([this._bodyArrayBuffer])) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as blob') + } else { + return Promise.resolve(new Blob([this._bodyText])) + } + }; + + this.arrayBuffer = function() { + if (this._bodyArrayBuffer) { + return consumed(this) || Promise.resolve(this._bodyArrayBuffer) + } else { + return this.blob().then(readBlobAsArrayBuffer) + } + }; + } + + this.text = function() { + var rejected = consumed(this); + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return readBlobAsText(this._bodyBlob) + } else if (this._bodyArrayBuffer) { + return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as text') + } else { + return Promise.resolve(this._bodyText) + } + }; + + if (support.formData) { + this.formData = function() { + return this.text().then(decode) + }; + } + + this.json = function() { + return this.text().then(JSON.parse) + }; + + return this + } + + // HTTP methods whose capitalization should be normalized + var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']; + + function normalizeMethod(method) { + var upcased = method.toUpperCase(); + return (methods.indexOf(upcased) > -1) ? upcased : method + } + + function Request(input, options) { + options = options || {}; + var body = options.body; + + if (input instanceof Request) { + if (input.bodyUsed) { + throw new TypeError('Already read') + } + this.url = input.url; + this.credentials = input.credentials; + if (!options.headers) { + this.headers = new Headers(input.headers); + } + this.method = input.method; + this.mode = input.mode; + if (!body && input._bodyInit != null) { + body = input._bodyInit; + input.bodyUsed = true; + } + } else { + this.url = String(input); + } + + this.credentials = options.credentials || this.credentials || 'omit'; + if (options.headers || !this.headers) { + this.headers = new Headers(options.headers); + } + this.method = normalizeMethod(options.method || this.method || 'GET'); + this.mode = options.mode || this.mode || null; + this.referrer = null; + + if ((this.method === 'GET' || this.method === 'HEAD') && body) { + throw new TypeError('Body not allowed for GET or HEAD requests') + } + this._initBody(body); + } + + Request.prototype.clone = function() { + return new Request(this, { body: this._bodyInit }) + }; + + function decode(body) { + var form = new FormData(); + body.trim().split('&').forEach(function(bytes) { + if (bytes) { + var split = bytes.split('='); + var name = split.shift().replace(/\+/g, ' '); + var value = split.join('=').replace(/\+/g, ' '); + form.append(decodeURIComponent(name), decodeURIComponent(value)); + } + }); + return form + } + + function parseHeaders(rawHeaders) { + var headers = new Headers(); + rawHeaders.split(/\r?\n/).forEach(function(line) { + var parts = line.split(':'); + var key = parts.shift().trim(); + if (key) { + var value = parts.join(':').trim(); + headers.append(key, value); + } + }); + return headers + } + + Body.call(Request.prototype); + + function Response(bodyInit, options) { + if (!options) { + options = {}; + } + + this.type = 'default'; + this.status = 'status' in options ? options.status : 200; + this.ok = this.status >= 200 && this.status < 300; + this.statusText = 'statusText' in options ? options.statusText : 'OK'; + this.headers = new Headers(options.headers); + this.url = options.url || ''; + this._initBody(bodyInit); + } + + Body.call(Response.prototype); + + Response.prototype.clone = function() { + return new Response(this._bodyInit, { + status: this.status, + statusText: this.statusText, + headers: new Headers(this.headers), + url: this.url + }) + }; + + Response.error = function() { + var response = new Response(null, {status: 0, statusText: ''}); + response.type = 'error'; + return response + }; + + var redirectStatuses = [301, 302, 303, 307, 308]; + + Response.redirect = function(url, status) { + if (redirectStatuses.indexOf(status) === -1) { + throw new RangeError('Invalid status code') + } + + return new Response(null, {status: status, headers: {location: url}}) + }; + + self.Headers = Headers; + self.Request = Request; + self.Response = Response; + + self.fetch = function(input, init) { + return new Promise(function(resolve, reject) { + var request = new Request(input, init); + var xhr = new XMLHttpRequest(); + + xhr.onload = function() { + var options = { + status: xhr.status, + statusText: xhr.statusText, + headers: parseHeaders(xhr.getAllResponseHeaders() || '') + }; + options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL'); + var body = 'response' in xhr ? xhr.response : xhr.responseText; + resolve(new Response(body, options)); + }; + + xhr.onerror = function() { + reject(new TypeError('Network request failed')); + }; + + xhr.ontimeout = function() { + reject(new TypeError('Network request failed')); + }; + + xhr.open(request.method, request.url, true); + + if (request.credentials === 'include') { + xhr.withCredentials = true; + } + + if ('responseType' in xhr && support.blob) { + xhr.responseType = 'blob'; + } + + request.headers.forEach(function(value, name) { + xhr.setRequestHeader(name, value); + }); + + xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit); + }) + }; + self.fetch.polyfill = true; +})(typeof self !== 'undefined' ? self : undefined); + +var read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? (nBytes - 1) : 0; + var d = isLE ? -1 : 1; + var s = buffer[offset + i]; + + i += d; + + e = s & ((1 << (-nBits)) - 1); + s >>= (-nBits); + nBits += eLen; + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1); + e >>= (-nBits); + nBits += mLen; + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen); + e = e - eBias; + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +}; + +var write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); + var i = isLE ? 0 : (nBytes - 1); + var d = isLE ? 1 : -1; + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; + + value = Math.abs(value); + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; + } + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + if (value * c >= 2) { + e++; + c /= 2; + } + + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m; + eLen += mLen; + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128; +}; + +var index$1 = { + read: read, + write: write +}; + +var index = Pbf; + +var ieee754 = index$1; + +function Pbf(buf) { + this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0); + this.pos = 0; + this.type = 0; + this.length = this.buf.length; +} + +Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum +Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 +Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields +Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 + +var SHIFT_LEFT_32 = (1 << 16) * (1 << 16); +var SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; + +Pbf.prototype = { + + destroy: function() { + this.buf = null; + }, + + // === READING ================================================================= + + readFields: function(readField, result, end) { + var this$1 = this; + + end = end || this.length; + + while (this.pos < end) { + var val = this$1.readVarint(), + tag = val >> 3, + startPos = this$1.pos; + + this$1.type = val & 0x7; + readField(tag, result, this$1); + + if (this$1.pos === startPos) { this$1.skip(val); } + } + return result; + }, + + readMessage: function(readField, result) { + return this.readFields(readField, result, this.readVarint() + this.pos); + }, + + readFixed32: function() { + var val = readUInt32(this.buf, this.pos); + this.pos += 4; + return val; + }, + + readSFixed32: function() { + var val = readInt32(this.buf, this.pos); + this.pos += 4; + return val; + }, + + // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) + + readFixed64: function() { + var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readSFixed64: function() { + var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readFloat: function() { + var val = ieee754.read(this.buf, this.pos, true, 23, 4); + this.pos += 4; + return val; + }, + + readDouble: function() { + var val = ieee754.read(this.buf, this.pos, true, 52, 8); + this.pos += 8; + return val; + }, + + readVarint: function(isSigned) { + var buf = this.buf, + val, b; + + b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) { return val; } + b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) { return val; } + b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) { return val; } + b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) { return val; } + b = buf[this.pos]; val |= (b & 0x0f) << 28; + + return readVarintRemainder(val, isSigned, this); + }, + + readVarint64: function() { // for compatibility with v2.0.1 + return this.readVarint(true); + }, + + readSVarint: function() { + var num = this.readVarint(); + return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding + }, + + readBoolean: function() { + return Boolean(this.readVarint()); + }, + + readString: function() { + var end = this.readVarint() + this.pos, + str = readUtf8(this.buf, this.pos, end); + this.pos = end; + return str; + }, + + readBytes: function() { + var end = this.readVarint() + this.pos, + buffer = this.buf.subarray(this.pos, end); + this.pos = end; + return buffer; + }, + + // verbose for performance reasons; doesn't affect gzipped size + + readPackedVarint: function(arr, isSigned) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readVarint(isSigned)); } + return arr; + }, + readPackedSVarint: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readSVarint()); } + return arr; + }, + readPackedBoolean: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readBoolean()); } + return arr; + }, + readPackedFloat: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readFloat()); } + return arr; + }, + readPackedDouble: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readDouble()); } + return arr; + }, + readPackedFixed32: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readFixed32()); } + return arr; + }, + readPackedSFixed32: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readSFixed32()); } + return arr; + }, + readPackedFixed64: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readFixed64()); } + return arr; + }, + readPackedSFixed64: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readSFixed64()); } + return arr; + }, + + skip: function(val) { + var type = val & 0x7; + if (type === Pbf.Varint) { while (this.buf[this.pos++] > 0x7f) {} } + else if (type === Pbf.Bytes) { this.pos = this.readVarint() + this.pos; } + else if (type === Pbf.Fixed32) { this.pos += 4; } + else if (type === Pbf.Fixed64) { this.pos += 8; } + else { throw new Error('Unimplemented type: ' + type); } + }, + + // === WRITING ================================================================= + + writeTag: function(tag, type) { + this.writeVarint((tag << 3) | type); + }, + + realloc: function(min) { + var length = this.length || 16; + + while (length < this.pos + min) { length *= 2; } + + if (length !== this.length) { + var buf = new Uint8Array(length); + buf.set(this.buf); + this.buf = buf; + this.length = length; + } + }, + + finish: function() { + this.length = this.pos; + this.pos = 0; + return this.buf.subarray(0, this.length); + }, + + writeFixed32: function(val) { + this.realloc(4); + writeInt32(this.buf, val, this.pos); + this.pos += 4; + }, + + writeSFixed32: function(val) { + this.realloc(4); + writeInt32(this.buf, val, this.pos); + this.pos += 4; + }, + + writeFixed64: function(val) { + this.realloc(8); + writeInt32(this.buf, val & -1, this.pos); + writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + + writeSFixed64: function(val) { + this.realloc(8); + writeInt32(this.buf, val & -1, this.pos); + writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + + writeVarint: function(val) { + val = +val || 0; + + if (val > 0xfffffff || val < 0) { + writeBigVarint(val, this); + return; + } + + this.realloc(4); + + this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } + this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } + this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } + this.buf[this.pos++] = (val >>> 7) & 0x7f; + }, + + writeSVarint: function(val) { + this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); + }, + + writeBoolean: function(val) { + this.writeVarint(Boolean(val)); + }, + + writeString: function(str) { + str = String(str); + this.realloc(str.length * 4); + + this.pos++; // reserve 1 byte for short string length + + var startPos = this.pos; + // write the string directly to the buffer and see how much was written + this.pos = writeUtf8(this.buf, str, this.pos); + var len = this.pos - startPos; + + if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); } + + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, + + writeFloat: function(val) { + this.realloc(4); + ieee754.write(this.buf, val, this.pos, true, 23, 4); + this.pos += 4; + }, + + writeDouble: function(val) { + this.realloc(8); + ieee754.write(this.buf, val, this.pos, true, 52, 8); + this.pos += 8; + }, + + writeBytes: function(buffer) { + var this$1 = this; + + var len = buffer.length; + this.writeVarint(len); + this.realloc(len); + for (var i = 0; i < len; i++) { this$1.buf[this$1.pos++] = buffer[i]; } + }, + + writeRawMessage: function(fn, obj) { + this.pos++; // reserve 1 byte for short message length + + // write the message directly to the buffer and see how much was written + var startPos = this.pos; + fn(obj, this); + var len = this.pos - startPos; + + if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); } + + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, + + writeMessage: function(tag, fn, obj) { + this.writeTag(tag, Pbf.Bytes); + this.writeRawMessage(fn, obj); + }, + + writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, + writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, + writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, + writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, + writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, + writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, + writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, + writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, + writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, + + writeBytesField: function(tag, buffer) { + this.writeTag(tag, Pbf.Bytes); + this.writeBytes(buffer); + }, + writeFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFixed32(val); + }, + writeSFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeSFixed32(val); + }, + writeFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeFixed64(val); + }, + writeSFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeSFixed64(val); + }, + writeVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeVarint(val); + }, + writeSVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeSVarint(val); + }, + writeStringField: function(tag, str) { + this.writeTag(tag, Pbf.Bytes); + this.writeString(str); + }, + writeFloatField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFloat(val); + }, + writeDoubleField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeDouble(val); + }, + writeBooleanField: function(tag, val) { + this.writeVarintField(tag, Boolean(val)); + } +}; + +function readVarintRemainder(l, s, p) { + var buf = p.buf, + h, b; + + b = buf[p.pos++]; h = (b & 0x70) >> 4; if (b < 0x80) { return toNum(l, h, s); } + b = buf[p.pos++]; h |= (b & 0x7f) << 3; if (b < 0x80) { return toNum(l, h, s); } + b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) { return toNum(l, h, s); } + b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) { return toNum(l, h, s); } + b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) { return toNum(l, h, s); } + b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) { return toNum(l, h, s); } + + throw new Error('Expected varint not more than 10 bytes'); +} + +function readPackedEnd(pbf) { + return pbf.type === Pbf.Bytes ? + pbf.readVarint() + pbf.pos : pbf.pos + 1; +} + +function toNum(low, high, isSigned) { + if (isSigned) { + return high * 0x100000000 + (low >>> 0); + } + + return ((high >>> 0) * 0x100000000) + (low >>> 0); +} + +function writeBigVarint(val, pbf) { + var low, high; + + if (val >= 0) { + low = (val % 0x100000000) | 0; + high = (val / 0x100000000) | 0; + } else { + low = ~(-val % 0x100000000); + high = ~(-val / 0x100000000); + + if (low ^ 0xffffffff) { + low = (low + 1) | 0; + } else { + low = 0; + high = (high + 1) | 0; + } + } + + if (val >= 0x10000000000000000 || val < -0x10000000000000000) { + throw new Error('Given varint doesn\'t fit into 10 bytes'); + } + + pbf.realloc(10); + + writeBigVarintLow(low, high, pbf); + writeBigVarintHigh(high, pbf); +} + +function writeBigVarintLow(low, high, pbf) { + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos] = low & 0x7f; +} + +function writeBigVarintHigh(high, pbf) { + var lsb = (high & 0x07) << 4; + + pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0); if (!high) { return; } + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } + pbf.buf[pbf.pos++] = high & 0x7f; +} + +function makeRoomForExtraLength(startPos, len, pbf) { + var extraLen = + len <= 0x3fff ? 1 : + len <= 0x1fffff ? 2 : + len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); + + // if 1 byte isn't enough for encoding message length, shift the data to the right + pbf.realloc(extraLen); + for (var i = pbf.pos - 1; i >= startPos; i--) { pbf.buf[i + extraLen] = pbf.buf[i]; } +} + +function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeVarint(arr[i]); } } +function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSVarint(arr[i]); } } +function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFloat(arr[i]); } } +function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeDouble(arr[i]); } } +function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeBoolean(arr[i]); } } +function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFixed32(arr[i]); } } +function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed32(arr[i]); } } +function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFixed64(arr[i]); } } +function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed64(arr[i]); } } + +// Buffer code below from https://github.com/feross/buffer, MIT-licensed + +function readUInt32(buf, pos) { + return ((buf[pos]) | + (buf[pos + 1] << 8) | + (buf[pos + 2] << 16)) + + (buf[pos + 3] * 0x1000000); +} + +function writeInt32(buf, val, pos) { + buf[pos] = val; + buf[pos + 1] = (val >>> 8); + buf[pos + 2] = (val >>> 16); + buf[pos + 3] = (val >>> 24); +} + +function readInt32(buf, pos) { + return ((buf[pos]) | + (buf[pos + 1] << 8) | + (buf[pos + 2] << 16)) + + (buf[pos + 3] << 24); +} + +function readUtf8(buf, pos, end) { + var str = ''; + var i = pos; + + while (i < end) { + var b0 = buf[i]; + var c = null; // codepoint + var bytesPerSequence = + b0 > 0xEF ? 4 : + b0 > 0xDF ? 3 : + b0 > 0xBF ? 2 : 1; + + if (i + bytesPerSequence > end) { break; } + + var b1, b2, b3; + + if (bytesPerSequence === 1) { + if (b0 < 0x80) { + c = b0; + } + } else if (bytesPerSequence === 2) { + b1 = buf[i + 1]; + if ((b1 & 0xC0) === 0x80) { + c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F); + if (c <= 0x7F) { + c = null; + } + } + } else if (bytesPerSequence === 3) { + b1 = buf[i + 1]; + b2 = buf[i + 2]; + if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) { + c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F); + if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) { + c = null; + } + } + } else if (bytesPerSequence === 4) { + b1 = buf[i + 1]; + b2 = buf[i + 2]; + b3 = buf[i + 3]; + if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) { + c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F); + if (c <= 0xFFFF || c >= 0x110000) { + c = null; + } + } + } + + if (c === null) { + c = 0xFFFD; + bytesPerSequence = 1; + + } else if (c > 0xFFFF) { + c -= 0x10000; + str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); + c = 0xDC00 | c & 0x3FF; + } + + str += String.fromCharCode(c); + i += bytesPerSequence; + } + + return str; +} + +function writeUtf8(buf, str, pos) { + for (var i = 0, c, lead; i < str.length; i++) { + c = str.charCodeAt(i); // code point + + if (c > 0xD7FF && c < 0xE000) { + if (lead) { + if (c < 0xDC00) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + lead = c; + continue; + } else { + c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; + lead = null; + } + } else { + if (c > 0xDBFF || (i + 1 === str.length)) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + } else { + lead = c; + } + continue; + } + } else if (lead) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + lead = null; + } + + if (c < 0x80) { + buf[pos++] = c; + } else { + if (c < 0x800) { + buf[pos++] = c >> 0x6 | 0xC0; + } else { + if (c < 0x10000) { + buf[pos++] = c >> 0xC | 0xE0; + } else { + buf[pos++] = c >> 0x12 | 0xF0; + buf[pos++] = c >> 0xC & 0x3F | 0x80; + } + buf[pos++] = c >> 0x6 & 0x3F | 0x80; + } + buf[pos++] = c & 0x3F | 0x80; + } + } + return pos; +} + +var index$5 = Point$1; + +function Point$1(x, y) { + this.x = x; + this.y = y; +} + +Point$1.prototype = { + clone: function() { return new Point$1(this.x, this.y); }, + + add: function(p) { return this.clone()._add(p); }, + sub: function(p) { return this.clone()._sub(p); }, + mult: function(k) { return this.clone()._mult(k); }, + div: function(k) { return this.clone()._div(k); }, + rotate: function(a) { return this.clone()._rotate(a); }, + matMult: function(m) { return this.clone()._matMult(m); }, + unit: function() { return this.clone()._unit(); }, + perp: function() { return this.clone()._perp(); }, + round: function() { return this.clone()._round(); }, + + mag: function() { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, + + equals: function(p) { + return this.x === p.x && + this.y === p.y; + }, + + dist: function(p) { + return Math.sqrt(this.distSqr(p)); + }, + + distSqr: function(p) { + var dx = p.x - this.x, + dy = p.y - this.y; + return dx * dx + dy * dy; + }, + + angle: function() { + return Math.atan2(this.y, this.x); + }, + + angleTo: function(b) { + return Math.atan2(this.y - b.y, this.x - b.x); + }, + + angleWith: function(b) { + return this.angleWithSep(b.x, b.y); + }, + + // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(?) for ?. + angleWithSep: function(x, y) { + return Math.atan2( + this.x * y - this.y * x, + this.x * x + this.y * y); + }, + + _matMult: function(m) { + var x = m[0] * this.x + m[1] * this.y, + y = m[2] * this.x + m[3] * this.y; + this.x = x; + this.y = y; + return this; + }, + + _add: function(p) { + this.x += p.x; + this.y += p.y; + return this; + }, + + _sub: function(p) { + this.x -= p.x; + this.y -= p.y; + return this; + }, + + _mult: function(k) { + this.x *= k; + this.y *= k; + return this; + }, + + _div: function(k) { + this.x /= k; + this.y /= k; + return this; + }, + + _unit: function() { + this._div(this.mag()); + return this; + }, + + _perp: function() { + var y = this.y; + this.y = this.x; + this.x = -y; + return this; + }, + + _rotate: function(angle) { + var cos = Math.cos(angle), + sin = Math.sin(angle), + x = cos * this.x - sin * this.y, + y = sin * this.x + cos * this.y; + this.x = x; + this.y = y; + return this; + }, + + _round: function() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + } +}; + +// constructs Point from an array if necessary +Point$1.convert = function (a) { + if (a instanceof Point$1) { + return a; + } + if (Array.isArray(a)) { + return new Point$1(a[0], a[1]); + } + return a; +}; + +var Point = index$5; + +var vectortilefeature = VectorTileFeature$2; + +function VectorTileFeature$2(pbf, end, extent, keys, values) { + // Public + this.properties = {}; + this.extent = extent; + this.type = 0; + + // Private + this._pbf = pbf; + this._geometry = -1; + this._keys = keys; + this._values = values; + + pbf.readFields(readFeature, this, end); +} + +function readFeature(tag, feature, pbf) { + if (tag == 1) { feature.id = pbf.readVarint(); } + else if (tag == 2) { readTag(pbf, feature); } + else if (tag == 3) { feature.type = pbf.readVarint(); } + else if (tag == 4) { feature._geometry = pbf.pos; } +} + +function readTag(pbf, feature) { + var end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var key = feature._keys[pbf.readVarint()], + value = feature._values[pbf.readVarint()]; + feature.properties[key] = value; + } +} + +VectorTileFeature$2.types = ['Unknown', 'Point', 'LineString', 'Polygon']; + +VectorTileFeature$2.prototype.loadGeometry = function() { + var pbf = this._pbf; + pbf.pos = this._geometry; + + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + lines = [], + line; + + while (pbf.pos < end) { + if (!length) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + + if (cmd === 1) { // moveTo + if (line) { lines.push(line); } + line = []; + } + + line.push(new Point(x, y)); + + } else if (cmd === 7) { + + // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 + if (line) { + line.push(line[0].clone()); // closePolygon + } + + } else { + throw new Error('unknown command ' + cmd); + } + } + + if (line) { lines.push(line); } + + return lines; +}; + +VectorTileFeature$2.prototype.bbox = function() { + var pbf = this._pbf; + pbf.pos = this._geometry; + + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + x1 = Infinity, + x2 = -Infinity, + y1 = Infinity, + y2 = -Infinity; + + while (pbf.pos < end) { + if (!length) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + if (x < x1) { x1 = x; } + if (x > x2) { x2 = x; } + if (y < y1) { y1 = y; } + if (y > y2) { y2 = y; } + + } else if (cmd !== 7) { + throw new Error('unknown command ' + cmd); + } + } + + return [x1, y1, x2, y2]; +}; + +VectorTileFeature$2.prototype.toGeoJSON = function(x, y, z) { + var size = this.extent * Math.pow(2, z), + x0 = this.extent * x, + y0 = this.extent * y, + coords = this.loadGeometry(), + type = VectorTileFeature$2.types[this.type], + i, j; + + function project(line) { + for (var j = 0; j < line.length; j++) { + var p = line[j], y2 = 180 - (p.y + y0) * 360 / size; + line[j] = [ + (p.x + x0) * 360 / size - 180, + 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 + ]; + } + } + + switch (this.type) { + case 1: + var points = []; + for (i = 0; i < coords.length; i++) { + points[i] = coords[i][0]; + } + coords = points; + project(coords); + break; + + case 2: + for (i = 0; i < coords.length; i++) { + project(coords[i]); + } + break; + + case 3: + coords = classifyRings(coords); + for (i = 0; i < coords.length; i++) { + for (j = 0; j < coords[i].length; j++) { + project(coords[i][j]); + } + } + break; + } + + if (coords.length === 1) { + coords = coords[0]; + } else { + type = 'Multi' + type; + } + + var result = { + type: "Feature", + geometry: { + type: type, + coordinates: coords + }, + properties: this.properties + }; + + if ('id' in this) { + result.id = this.id; + } + + return result; +}; + +// classifies an array of rings into polygons with outer rings and holes + +function classifyRings(rings) { + var len = rings.length; + + if (len <= 1) { return [rings]; } + + var polygons = [], + polygon, + ccw; + + for (var i = 0; i < len; i++) { + var area = signedArea(rings[i]); + if (area === 0) { continue; } + + if (ccw === undefined) { ccw = area < 0; } + + if (ccw === area < 0) { + if (polygon) { polygons.push(polygon); } + polygon = [rings[i]]; + + } else { + polygon.push(rings[i]); + } + } + if (polygon) { polygons.push(polygon); } + + return polygons; +} + +function signedArea(ring) { + var sum = 0; + for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { + p1 = ring[i]; + p2 = ring[j]; + sum += (p2.x - p1.x) * (p1.y + p2.y); + } + return sum; +} + +var VectorTileFeature$1 = vectortilefeature; + +var vectortilelayer = VectorTileLayer$2; + +function VectorTileLayer$2(pbf, end) { + // Public + this.version = 1; + this.name = null; + this.extent = 4096; + this.length = 0; + + // Private + this._pbf = pbf; + this._keys = []; + this._values = []; + this._features = []; + + pbf.readFields(readLayer, this, end); + + this.length = this._features.length; +} + +function readLayer(tag, layer, pbf) { + if (tag === 15) { layer.version = pbf.readVarint(); } + else if (tag === 1) { layer.name = pbf.readString(); } + else if (tag === 5) { layer.extent = pbf.readVarint(); } + else if (tag === 2) { layer._features.push(pbf.pos); } + else if (tag === 3) { layer._keys.push(pbf.readString()); } + else if (tag === 4) { layer._values.push(readValueMessage(pbf)); } +} + +function readValueMessage(pbf) { + var value = null, + end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var tag = pbf.readVarint() >> 3; + + value = tag === 1 ? pbf.readString() : + tag === 2 ? pbf.readFloat() : + tag === 3 ? pbf.readDouble() : + tag === 4 ? pbf.readVarint64() : + tag === 5 ? pbf.readVarint() : + tag === 6 ? pbf.readSVarint() : + tag === 7 ? pbf.readBoolean() : null; + } + + return value; +} + +// return feature `i` from this layer as a `VectorTileFeature` +VectorTileLayer$2.prototype.feature = function(i) { + if (i < 0 || i >= this._features.length) { throw new Error('feature index out of bounds'); } + + this._pbf.pos = this._features[i]; + + var end = this._pbf.readVarint() + this._pbf.pos; + return new VectorTileFeature$1(this._pbf, end, this.extent, this._keys, this._values); +}; + +var VectorTileLayer$1 = vectortilelayer; + +var vectortile = VectorTile$1; + +function VectorTile$1(pbf, end) { + this.layers = pbf.readFields(readTile, {}, end); +} + +function readTile(tag, layers, pbf) { + if (tag === 3) { + var layer = new VectorTileLayer$1(pbf, pbf.readVarint() + pbf.pos); + if (layer.length) { layers[layer.name] = layer; } + } +} + +var VectorTile = vectortile; + +L.SVG.Tile = L.SVG.extend({ + + initialize: function (tileCoord, tileSize, options) { + L.SVG.prototype.initialize.call(this, options); + this._tileCoord = tileCoord; + this._size = tileSize; + + this._initContainer(); + this._container.setAttribute('width', this._size.x); + this._container.setAttribute('height', this._size.y); + this._container.setAttribute('viewBox', [0, 0, this._size.x, this._size.y].join(' ')); + + this._layers = {}; + }, + + getCoord: function() { + return this._tileCoord; + }, + + getContainer: function() { + return this._container; + }, + + onAdd: L.Util.falseFn, + + addTo: function(map) { + this._map = map; + if (this.options.interactive) { + for (var i in this._layers) { + var layer = this._layers[i]; + // By default, Leaflet tiles do not have pointer events. + layer._path.style.pointerEvents = 'auto'; + this._map._targets[L.stamp(layer._path)] = layer; + } + } + }, + + removeFrom: function (map) { + if (this.options.interactive) { + for (var i in this._layers) { + var layer = this._layers[i]; + delete this._map._targets[L.stamp(layer._path)]; + } + } + delete this._map; + }, + + _initContainer: function() { + L.SVG.prototype._initContainer.call(this); + var rect = L.SVG.create('rect'); + }, + + /// TODO: Modify _initPath to include an extra parameter, a group name + /// to order symbolizers by z-index + + _addPath: function (layer) { + this._rootGroup.appendChild(layer._path); + this._layers[L.stamp(layer)] = layer; + }, + + _updateIcon: function (layer) { + var path = layer._path = L.SVG.create('image'), + icon = layer.options.icon, + options = icon.options, + size = L.point(options.iconSize), + anchor = options.iconAnchor || + size && size.divideBy(2, true), + p = layer._point.subtract(anchor); + path.setAttribute('x', p.x); + path.setAttribute('y', p.y); + path.setAttribute('width', size.x + 'px'); + path.setAttribute('height', size.y + 'px'); + path.setAttribute('href', options.iconUrl); + } +}); + + +L.svg.tile = function(tileCoord, tileSize, opts){ + return new L.SVG.Tile(tileCoord, tileSize, opts); +}; + +// ??class Symbolizer +// ??inherits Class +// The abstract Symbolizer class is mostly equivalent in concept to a `L.Path` - it's an interface for +// polylines, polygons and circles. But instead of representing leaflet Layers, +// it represents things that have to be drawn inside a vector tile. + +// A vector tile *data layer* might have zero, one, or more *symbolizer definitions* +// A vector tile *feature* might have zero, one, or more *symbolizers*. +// The actual symbolizers applied will depend on filters and the symbolizer functions. + +var Symbolizer = L.Class.extend({ + // ??method initialize(feature: GeoJSON, pxPerExtent: Number) + // Initializes a new Line Symbolizer given a GeoJSON feature and the + // pixel-to-coordinate-units ratio. Internal use only. + + // ??method render(renderer, style) + // Renders this symbolizer in the given tiled renderer, with the given + // `L.Path` options. Internal use only. + render: function(renderer, style) { + this._renderer = renderer; + this.options = style; + renderer._initPath(this); + renderer._updateStyle(this); + }, + + // ??method render(renderer, style) + // Updates the `L.Path` options used to style this symbolizer, and re-renders it. + // Internal use only. + updateStyle: function(renderer, style) { + this.options = style; + renderer._updateStyle(this); + }, + + _getPixelBounds: function() { + var parts = this._parts; + var bounds = L.bounds([]); + for (var i = 0; i < parts.length; i++) { + var part = parts[i]; + for (var j = 0; j < part.length; j++) { + bounds.extend(part[j]); + } + } + + var w = this._clickTolerance(), + p = new L.Point(w, w); + + bounds.min._subtract(p); + bounds.max._add(p); + + return bounds; + }, + _clickTolerance: L.Path.prototype._clickTolerance, +}); + +// Contains mixins which are common to the Line Symbolizer and the Fill Symbolizer. + +var PolyBase = { + _makeFeatureParts: function(feat, pxPerExtent) { + var rings = feat.geometry; + var coord; + + this._parts = []; + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; + var part = []; + for (var j = 0; j < ring.length; j++) { + coord = ring[j]; + // Protobuf vector tiles return {x: , y:} + // Geojson-vt returns [,] + part.push(L.point(coord).scaleBy(pxPerExtent)); + } + this._parts.push(part); + } + }, + + makeInteractive: function() { + this._pxBounds = this._getPixelBounds(); + } +}; + +// ??class PointSymbolizer +// ??inherits CircleMarker +// A symbolizer for points. + +var PointSymbolizer = L.CircleMarker.extend({ + includes: Symbolizer.prototype, + + statics: { + iconCache: {} + }, + + initialize: function(feature, pxPerExtent) { + this.properties = feature.properties; + this._makeFeatureParts(feature, pxPerExtent); + }, + + render: function(renderer, style) { + Symbolizer.prototype.render.call(this, renderer, style); + this._radius = style.radius || L.CircleMarker.prototype.options.radius; + this._updatePath(); + }, + + _makeFeatureParts: function(feat, pxPerExtent) { + var coord = feat.geometry[0]; + if (typeof coord[0] === 'object' && 'x' in coord[0]) { + // Protobuf vector tiles return [{x: , y:}] + this._point = L.point(coord[0]).scaleBy(pxPerExtent); + this._empty = L.Util.falseFn; + } else { + // Geojson-vt returns [,] + this._point = L.point(coord).scaleBy(pxPerExtent); + this._empty = L.Util.falseFn; + } + }, + + makeInteractive: function() { + this._updateBounds(); + }, + + updateStyle: function(renderer, style) { + this._radius = style.radius || this._radius; + this._updateBounds(); + return Symbolizer.prototype.updateStyle.call(this, renderer, style); + }, + + _updateBounds: function() { + var icon = this.options.icon; + if (icon) { + var size = L.point(icon.options.iconSize), + anchor = icon.options.iconAnchor || + size && size.divideBy(2, true), + p = this._point.subtract(anchor); + this._pxBounds = new L.Bounds(p, p.add(icon.options.iconSize)); + } else { + L.CircleMarker.prototype._updateBounds.call(this); + } + }, + + _updatePath: function() { + if (this.options.icon) { + this._renderer._updateIcon(this); + } else { + L.CircleMarker.prototype._updatePath.call(this); + } + }, + + _getImage: function () { + if (this.options.icon) { + var url = this.options.icon.options.iconUrl, + img = PointSymbolizer.iconCache[url]; + if (!img) { + var icon = this.options.icon; + img = PointSymbolizer.iconCache[url] = icon.createIcon(); + } + return img; + } else { + return null; + } + + }, + + _containsPoint: function(p) { + var icon = this.options.icon; + if (icon) { + return this._pxBounds.contains(p); + } else { + return L.CircleMarker.prototype._containsPoint.call(this, p); + } + } +}); + +// ??class LineSymbolizer +// ??inherits Polyline +// A symbolizer for lines. Can be applied to line and polygon features. + +var LineSymbolizer = L.Polyline.extend({ + includes: [Symbolizer.prototype, PolyBase], + + initialize: function(feature, pxPerExtent) { + this.properties = feature.properties; + this._makeFeatureParts(feature, pxPerExtent); + }, + + render: function(renderer, style) { + style.fill = false; + Symbolizer.prototype.render.call(this, renderer, style); + this._updatePath(); + }, + + updateStyle: function(renderer, style) { + style.fill = false; + Symbolizer.prototype.updateStyle.call(this, renderer, style); + }, +}); + +// ??class FillSymbolizer +// ??inherits Polyline +// A symbolizer for filled areas. Applies only to polygon features. + +var FillSymbolizer = L.Polygon.extend({ + includes: [Symbolizer.prototype, PolyBase], + + initialize: function(feature, pxPerExtent) { + this.properties = feature.properties; + this._makeFeatureParts(feature, pxPerExtent); + }, + + render: function(renderer, style) { + Symbolizer.prototype.render.call(this, renderer, style); + this._updatePath(); + } +}); + +/* ??class VectorGrid + * ??inherits GridLayer + * + * A `VectorGrid` is a generic, abstract class for displaying tiled vector data. + * it provides facilities for symbolizing and rendering the data in the vector + * tiles, but lacks the functionality to fetch the vector tiles from wherever + * they are. + * + * Extends Leaflet's `L.GridLayer`. + */ + +L.VectorGrid = L.GridLayer.extend({ + + options: { + // ??option rendererFactory = L.svg.tile + // A factory method which will be used to instantiate the per-tile renderers. + rendererFactory: L.svg.tile, + + // ??option vectorTileLayerStyles: Object = {} + // A data structure holding initial symbolizer definitions for the vector features. + vectorTileLayerStyles: {}, + + onEachFeature: null, + + // ??option interactive: Boolean = false + // Whether this `VectorGrid` fires `Interactive Layer` events. + interactive: false, + + // ??option getFeatureId: Function = undefined + // A function that, given a vector feature, returns an unique identifier for it, e.g. + // `function(feat) { return feat.properties.uniqueIdField; }`. + // Must be defined for `setFeatureStyle` to work. + }, + + initialize: function(options) { + L.setOptions(this, options); + L.GridLayer.prototype.initialize.apply(this, arguments); + if (this.options.getFeatureId) { + this._vectorTiles = {}; + this._overriddenStyles = {}; + } + this._userLayers = {}; + this.on('tileunload', function(e) { + this._tileUnload(e); + }, this); + this._dataLayerNames = {}; + }, + + createTile: function(coords, done) { + var storeFeatures = this.options.getFeatureId; + var onEachFeature = this.options.onEachFeature; + + var tileSize = this.getTileSize(); + var renderer = this.options.rendererFactory(coords, tileSize, this.options); + + var vectorTilePromise = this._getVectorTilePromise(coords); + + if (storeFeatures) { + this._vectorTiles[this._tileCoordsToKey(coords)] = renderer; + renderer._features = {}; + } + + vectorTilePromise.then( function renderTile(vectorTile) { + for (var layerName in vectorTile.layers) { + this._dataLayerNames[layerName] = true; + var layer = vectorTile.layers[layerName]; + + var pxPerExtent = this.getTileSize().divideBy(layer.extent); + + var layerStyle = this.options.vectorTileLayerStyles[ layerName ] || + L.Path.prototype.options; + + for (var i = 0; i < layer.features.length; i++) { + var feat = layer.features[i]; + var id; + + var styleOptions = layerStyle; + if (storeFeatures) { + id = this.options.getFeatureId(feat); + var styleOverride = this._overriddenStyles[id]; + if (styleOverride) { + if (styleOverride[layerName]) { + styleOptions = styleOverride[layerName]; + } else { + styleOptions = styleOverride; + } + } + } + + if (styleOptions instanceof Function) { + styleOptions = styleOptions(feat.properties, coords.z, feat.type); + } + + if (!(styleOptions instanceof Array)) { + styleOptions = [styleOptions]; + } + + if (!styleOptions.length) { + if (onEachFeature) { + onEachFeature.call(this, feat, null, layer, coords); + } + continue; + } + + var featureLayer = this._createLayer(feat, pxPerExtent); + + if (onEachFeature) { + onEachFeature.call(this, feat, null, layer, coords); + } + + for (var j = 0; j < styleOptions.length; j++) { + if (styleOptions[j] instanceof Function) { + var styleOption = styleOptions[j](feat.properties, coords.z, feat.type); + } + var style = L.extend({}, L.Path.prototype.options, styleOption); + featureLayer.render(renderer, style); + renderer._addPath(featureLayer); + } + + if (this.options.interactive) { + featureLayer.makeInteractive(); + } + + if (storeFeatures) { + renderer._features[id] = { + layerName: layerName, + feature: featureLayer + }; + } + } + + } + if (this._map != null) { + renderer.addTo(this._map); + } + L.Util.requestAnimFrame(done.bind(coords, null, null)); + }.bind(this)); + + return renderer.getContainer(); + }, + + // ??method setFeatureStyle(id: Number, layerStyle: L.Path Options): this + // Given the unique ID for a vector features (as per the `getFeatureId` option), + // re-symbolizes that feature across all tiles it appears in. + setFeatureStyle: function(id, layerStyle) { + this._overriddenStyles[id] = layerStyle; + + for (var tileKey in this._vectorTiles) { + var tile = this._vectorTiles[tileKey]; + var features = tile._features; + var data = features[id]; + if (data) { + var feat = data.feature; + + var styleOptions = layerStyle; + if (layerStyle[data.layerName]) { + styleOptions = layerStyle[data.layerName]; + } + + this._updateStyles(feat, tile, styleOptions); + } + } + return this; + }, + + // ??method setFeatureStyle(id: Number): this + // Reverts the effects of a previous `setFeatureStyle` call. + resetFeatureStyle: function(id) { + delete this._overriddenStyles[id]; + + for (var tileKey in this._vectorTiles) { + var tile = this._vectorTiles[tileKey]; + var features = tile._features; + var data = features[id]; + if (data) { + var feat = data.feature; + var styleOptions = this.options.vectorTileLayerStyles[ data.layerName ] || + L.Path.prototype.options; + this._updateStyles(feat, tile, styleOptions); + } + } + return this; + }, + + // ??method getDataLayerNames(): Array + // Returns an array of strings, with all the known names of data layers in + // the vector tiles displayed. Useful for introspection. + getDataLayerNames: function() { + return Object.keys(this._dataLayerNames); + }, + + vtGeometryToPoint: function(geometry, vtLayer, tileCoords) { + var pxPerExtent = this.getTileSize().x / vtLayer.extent; + var tileSize = this.getTileSize(); + var offset = tileCoords.scaleBy(tileSize); + var point; + if (typeof geometry[0] === 'object' && 'x' in geometry[0]) { + // Protobuf vector tiles return [{x: , y:}] + point = L.point(offset.x + (geometry[0].x * pxPerExtent), offset.y + (geometry[0].y * pxPerExtent)); + } else { + // Geojson-vt returns [,] + point = L.point(offset.x + (geometry[0] * pxPerExtent), offset.y + (geometry[1] * pxPerExtent)); + } + return point; + }, + + vtGeometryToLatLng: function(geometry, vtLayer, tileCoords) { + return this._map.unproject(this.vtGeometryToPoint(geometry, vtLayer, tileCoords)); + }, + + addUserLayer: function(userLayer, tileCoords) { + var tileKey = this._tileCoordsToKey(tileCoords); + this._userLayers[tileKey] = this._userLayers[tileKey] || []; + this._userLayers[tileKey].push(userLayer); + this._map.addLayer(userLayer); + }, + + _tileUnload: function(e) { + var tileKey = this._tileCoordsToKey(e.coords); + if (this._vectorTiles) { + delete this._vectorTiles[tileKey]; + } + var userLayers = this._userLayers[tileKey]; + if (!userLayers) { + return; + } + for(var i = 0; i < userLayers.length; i++) { +// console.log('remove layer'); + this._map.removeLayer(userLayers[i]); + } + delete this._userLayers[tileKey]; + }, + + _updateStyles: function(feat, renderer, styleOptions) { + styleOptions = (styleOptions instanceof Function) ? + styleOptions(feat.properties, renderer.getCoord().z, feat.type) : + styleOptions; + + if (!(styleOptions instanceof Array)) { + styleOptions = [styleOptions]; + } + + for (var j = 0; j < styleOptions.length; j++) { + + var styleOption = (styleOptions[j] instanceof Function) ? + styleOptions[j](feat.properties, renderer.getCoord().z, feat.type) : + styleOptions[j]; + + var style = L.extend({}, L.Path.prototype.options, styleOption); + feat.updateStyle(renderer, style); + } + }, + + _createLayer: function(feat, pxPerExtent, layerStyle) { + var layer; + switch (feat.type) { + case 1: + layer = new PointSymbolizer(feat, pxPerExtent); + break; + case 2: + layer = new LineSymbolizer(feat, pxPerExtent); + break; + case 3: + layer = new FillSymbolizer(feat, pxPerExtent); + break; + } + + if (this.options.interactive) { + layer.addEventParent(this); + } + + return layer; + }, +}); + +/* + * ??section Extension methods + * + * Classes inheriting from `VectorGrid` **must** define the `_getVectorTilePromise` private method. + * + * ??method getVectorTilePromise(coords: Object): Promise + * Given a `coords` object in the form of `{x: Number, y: Number, z: Number}`, + * this function must return a `Promise` for a vector tile. + * + */ +L.vectorGrid = function (options) { + return new L.VectorGrid(options); +}; + +/* + * ??class VectorGrid.Protobuf + * ??extends VectorGrid + * + * A `VectorGrid` for vector tiles fetched from the internet. + * Tiles are supposed to be protobufs (AKA "protobuffer" or "Protocol Buffers"), + * containing data which complies with the + * [MapBox Vector Tile Specification](https://github.com/mapbox/vector-tile-spec/tree/master/2.1). + * + * This is the format used by: + * - Mapbox Vector Tiles + * - Mapzen Vector Tiles + * - ESRI Vector Tiles + * - [OpenMapTiles hosted Vector Tiles](https://openmaptiles.com/hosting/) + * + * ??example + * + * You must initialize a `VectorGrid.Protobuf` with a URL template, just like in + * `L.TileLayer`s. The difference is that the template must point to vector tiles + * (usually `.pbf` or `.mvt`) instead of raster (`.png` or `.jpg`) tiles, and that + * you should define the styling for all the features. + * + *

+ * + * For OpenMapTiles, with a key from [https://openmaptiles.org/docs/host/use-cdn/](https://openmaptiles.org/docs/host/use-cdn/), + * initialization looks like this: + * + * ``` + * L.vectorGrid.protobuf("https://free-{s}.tilehosting.com/data/v3/{z}/{x}/{y}.pbf.pict?key={key}", { + * vectorTileLayerStyles: { ... }, + * subdomains: "0123", + * key: 'abcdefghi01234567890', + * maxNativeZoom: 14 + * }).addTo(map); + * ``` + * + * And for Mapbox vector tiles, it looks like this: + * + * ``` + * L.vectorGrid.protobuf("https://{s}.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6/{z}/{x}/{y}.vector.pbf?access_token={token}", { + * vectorTileLayerStyles: { ... }, + * subdomains: "abcd", + * token: "pk.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTS.TUVWXTZ0123456789abcde" + * }).addTo(map); + * ``` + */ +L.VectorGrid.Protobuf = L.VectorGrid.extend({ + + options: { + // ??section + // As with `L.TileLayer`, the URL template might contain a reference to + // any option (see the example above and note the `{key}` or `token` in the URL + // template, and the corresponding option). + // + // ??option subdomains: String = 'abc' + // Akin to the `subdomains` option for `L.TileLayer`. + subdomains: 'abc', // Like L.TileLayer + // + // ??option fetchOptions: Object = {} + // options passed to `fetch`, e.g. {credentials: 'same-origin'} to send cookie for the current domain + fetchOptions: {} + }, + + initialize: function(url, options) { + // Inherits options from geojson-vt! +// this._slicer = geojsonvt(geojson, options); + this._url = url; + L.VectorGrid.prototype.initialize.call(this, options); + }, + + // ??method setUrl(url: String, noRedraw?: Boolean): this + // Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`). + setUrl: function(url, noRedraw) { + this._url = url; + + if (!noRedraw) { + this.redraw(); + } + + return this; + }, + + _getSubdomain: L.TileLayer.prototype._getSubdomain, + + _getVectorTilePromise: function(coords) { + var data = { + s: this._getSubdomain(coords), + x: coords.x, + y: coords.y, + z: coords.z +// z: this._getZoomForUrl() /// TODO: Maybe replicate TileLayer's maxNativeZoom + }; + if (this._map && !this._map.options.crs.infinite) { + var invertedY = this._globalTileRange.max.y - coords.y; + if (this.options.tms) { // Should this option be available in Leaflet.VectorGrid? + data['y'] = invertedY; + } + data['-y'] = invertedY; + } + + var tileUrl = L.Util.template(this._url, L.extend(data, this.options)); + + return fetch(tileUrl, this.options.fetchOptions).then(function(response){ + + if (!response.ok) { + return {layers:[]}; + } + + return response.blob().then( function (blob) { +// console.log(blob); + + var reader = new FileReader(); + return new Promise(function(resolve){ + reader.addEventListener("loadend", function() { + // reader.result contains the contents of blob as a typed array + + // blob.type === 'application/x-protobuf' + var pbf = new index( reader.result ); +// console.log(pbf); + return resolve(new VectorTile( pbf )); + + }); + reader.readAsArrayBuffer(blob); + }); + }); + }).then(function(json){ + +// console.log('Vector tile:', json.layers); +// console.log('Vector tile water:', json.layers.water); // Instance of VectorTileLayer + + // Normalize feature getters into actual instanced features + for (var layerName in json.layers) { + var feats = []; + + for (var i=0; i maxSqDist) {\n index = i;\n maxSqDist = sqDist;\n }\n }\n\n if (maxSqDist > sqTolerance) {\n points[index][2] = maxSqDist; // save the point importance in squared pixels as a z coordinate\n stack.push(first);\n stack.push(index);\n first = index;\n\n } else {\n last = stack.pop();\n first = stack.pop();\n }\n }\n}\n\n// square distance from a point to a segment\nfunction getSqSegDist(p, a, b) {\n\n var x = a[0], y = a[1],\n bx = b[0], by = b[1],\n px = p[0], py = p[1],\n dx = bx - x,\n dy = by - y;\n\n if (dx !== 0 || dy !== 0) {\n\n var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);\n\n if (t > 1) {\n x = bx;\n y = by;\n\n } else if (t > 0) {\n x += dx * t;\n y += dy * t;\n }\n }\n\n dx = px - x;\n dy = py - y;\n\n return dx * dx + dy * dy;\n}\n\nvar convert_1 = convert$1;\n\nvar simplify = simplify_1;\n\n// converts GeoJSON feature into an intermediate projected JSON vector format with simplification data\n\nfunction convert$1(data, tolerance) {\n var features = [];\n\n if (data.type === 'FeatureCollection') {\n for (var i = 0; i < data.features.length; i++) {\n convertFeature(features, data.features[i], tolerance);\n }\n } else if (data.type === 'Feature') {\n convertFeature(features, data, tolerance);\n\n } else {\n // single geometry or a geometry collection\n convertFeature(features, {geometry: data}, tolerance);\n }\n return features;\n}\n\nfunction convertFeature(features, feature, tolerance) {\n if (feature.geometry === null) {\n // ignore features with null geometry\n return;\n }\n\n var geom = feature.geometry,\n type = geom.type,\n coords = geom.coordinates,\n tags = feature.properties,\n i, j, rings, projectedRing;\n\n if (type === 'Point') {\n features.push(create(tags, 1, [projectPoint(coords)]));\n\n } else if (type === 'MultiPoint') {\n features.push(create(tags, 1, project(coords)));\n\n } else if (type === 'LineString') {\n features.push(create(tags, 2, [project(coords, tolerance)]));\n\n } else if (type === 'MultiLineString' || type === 'Polygon') {\n rings = [];\n for (i = 0; i < coords.length; i++) {\n projectedRing = project(coords[i], tolerance);\n if (type === 'Polygon') { projectedRing.outer = (i === 0); }\n rings.push(projectedRing);\n }\n features.push(create(tags, type === 'Polygon' ? 3 : 2, rings));\n\n } else if (type === 'MultiPolygon') {\n rings = [];\n for (i = 0; i < coords.length; i++) {\n for (j = 0; j < coords[i].length; j++) {\n projectedRing = project(coords[i][j], tolerance);\n projectedRing.outer = (j === 0);\n rings.push(projectedRing);\n }\n }\n features.push(create(tags, 3, rings));\n\n } else if (type === 'GeometryCollection') {\n for (i = 0; i < geom.geometries.length; i++) {\n convertFeature(features, {\n geometry: geom.geometries[i],\n properties: tags\n }, tolerance);\n }\n\n } else {\n throw new Error('Input data is not a valid GeoJSON object.');\n }\n}\n\nfunction create(tags, type, geometry) {\n var feature = {\n geometry: geometry,\n type: type,\n tags: tags || null,\n min: [2, 1], // initial bbox values;\n max: [-1, 0] // note that coords are usually in [0..1] range\n };\n calcBBox(feature);\n return feature;\n}\n\nfunction project(lonlats, tolerance) {\n var projected = [];\n for (var i = 0; i < lonlats.length; i++) {\n projected.push(projectPoint(lonlats[i]));\n }\n if (tolerance) {\n simplify(projected, tolerance);\n calcSize(projected);\n }\n return projected;\n}\n\nfunction projectPoint(p) {\n var sin = Math.sin(p[1] * Math.PI / 180),\n x = (p[0] / 360 + 0.5),\n y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI);\n\n y = y < 0 ? 0 :\n y > 1 ? 1 : y;\n\n return [x, y, 0];\n}\n\n// calculate area and length of the poly\nfunction calcSize(points) {\n var area = 0,\n dist = 0;\n\n for (var i = 0, a, b; i < points.length - 1; i++) {\n a = b || points[i];\n b = points[i + 1];\n\n area += a[0] * b[1] - b[0] * a[1];\n\n // use Manhattan distance instead of Euclidian one to avoid expensive square root computation\n dist += Math.abs(b[0] - a[0]) + Math.abs(b[1] - a[1]);\n }\n points.area = Math.abs(area / 2);\n points.dist = dist;\n}\n\n// calculate the feature bounding box for faster clipping later\nfunction calcBBox(feature) {\n var geometry = feature.geometry,\n min = feature.min,\n max = feature.max;\n\n if (feature.type === 1) { calcRingBBox(min, max, geometry); }\n else { for (var i = 0; i < geometry.length; i++) { calcRingBBox(min, max, geometry[i]); } }\n\n return feature;\n}\n\nfunction calcRingBBox(min, max, points) {\n for (var i = 0, p; i < points.length; i++) {\n p = points[i];\n min[0] = Math.min(p[0], min[0]);\n max[0] = Math.max(p[0], max[0]);\n min[1] = Math.min(p[1], min[1]);\n max[1] = Math.max(p[1], max[1]);\n }\n}\n\nvar tile = transformTile;\nvar point = transformPoint;\n\n// Transforms the coordinates of each feature in the given tile from\n// mercator-projected space into (extent x extent) tile space.\nfunction transformTile(tile, extent) {\n if (tile.transformed) { return tile; }\n\n var z2 = tile.z2,\n tx = tile.x,\n ty = tile.y,\n i, j, k;\n\n for (i = 0; i < tile.features.length; i++) {\n var feature = tile.features[i],\n geom = feature.geometry,\n type = feature.type;\n\n if (type === 1) {\n for (j = 0; j < geom.length; j++) { geom[j] = transformPoint(geom[j], extent, z2, tx, ty); }\n\n } else {\n for (j = 0; j < geom.length; j++) {\n var ring = geom[j];\n for (k = 0; k < ring.length; k++) { ring[k] = transformPoint(ring[k], extent, z2, tx, ty); }\n }\n }\n }\n\n tile.transformed = true;\n\n return tile;\n}\n\nfunction transformPoint(p, extent, z2, tx, ty) {\n var x = Math.round(extent * (p[0] * z2 - tx)),\n y = Math.round(extent * (p[1] * z2 - ty));\n return [x, y];\n}\n\nvar transform$1 = {\n tile: tile,\n point: point\n};\n\nvar clip_1 = clip$1;\n\n/* clip features between two axis-parallel lines:\n * | |\n * ___|___ | /\n * / | \____|____/\n * | |\n */\n\nfunction clip$1(features, scale, k1, k2, axis, intersect, minAll, maxAll) {\n\n k1 /= scale;\n k2 /= scale;\n\n if (minAll >= k1 && maxAll <= k2) { return features; } // trivial accept\n else if (minAll > k2 || maxAll < k1) { return null; } // trivial reject\n\n var clipped = [];\n\n for (var i = 0; i < features.length; i++) {\n\n var feature = features[i],\n geometry = feature.geometry,\n type = feature.type,\n min, max;\n\n min = feature.min[axis];\n max = feature.max[axis];\n\n if (min >= k1 && max <= k2) { // trivial accept\n clipped.push(feature);\n continue;\n } else if (min > k2 || max < k1) { continue; } // trivial reject\n\n var slices = type === 1 ?\n clipPoints(geometry, k1, k2, axis) :\n clipGeometry(geometry, k1, k2, axis, intersect, type === 3);\n\n if (slices.length) {\n // if a feature got clipped, it will likely get clipped on the next zoom level as well,\n // so there's no need to recalculate bboxes\n clipped.push({\n geometry: slices,\n type: type,\n tags: features[i].tags || null,\n min: feature.min,\n max: feature.max\n });\n }\n }\n\n return clipped.length ? clipped : null;\n}\n\nfunction clipPoints(geometry, k1, k2, axis) {\n var slice = [];\n\n for (var i = 0; i < geometry.length; i++) {\n var a = geometry[i],\n ak = a[axis];\n\n if (ak >= k1 && ak <= k2) { slice.push(a); }\n }\n return slice;\n}\n\nfunction clipGeometry(geometry, k1, k2, axis, intersect, closed) {\n\n var slices = [];\n\n for (var i = 0; i < geometry.length; i++) {\n\n var ak = 0,\n bk = 0,\n b = null,\n points = geometry[i],\n area = points.area,\n dist = points.dist,\n outer = points.outer,\n len = points.length,\n a, j, last;\n\n var slice = [];\n\n for (j = 0; j < len - 1; j++) {\n a = b || points[j];\n b = points[j + 1];\n ak = bk || a[axis];\n bk = b[axis];\n\n if (ak < k1) {\n\n if ((bk > k2)) { // ---|-----|-->\n slice.push(intersect(a, b, k1), intersect(a, b, k2));\n if (!closed) { slice = newSlice(slices, slice, area, dist, outer); }\n\n } else if (bk >= k1) { slice.push(intersect(a, b, k1)); } // ---|--> |\n\n } else if (ak > k2) {\n\n if ((bk < k1)) { // <--|-----|---\n slice.push(intersect(a, b, k2), intersect(a, b, k1));\n if (!closed) { slice = newSlice(slices, slice, area, dist, outer); }\n\n } else if (bk <= k2) { slice.push(intersect(a, b, k2)); } // | <--|---\n\n } else {\n\n slice.push(a);\n\n if (bk < k1) { // <--|--- |\n slice.push(intersect(a, b, k1));\n if (!closed) { slice = newSlice(slices, slice, area, dist, outer); }\n\n } else if (bk > k2) { // | ---|-->\n slice.push(intersect(a, b, k2));\n if (!closed) { slice = newSlice(slices, slice, area, dist, outer); }\n }\n // | --> |\n }\n }\n\n // add the last point\n a = points[len - 1];\n ak = a[axis];\n if (ak >= k1 && ak <= k2) { slice.push(a); }\n\n // close the polygon if its endpoints are not the same after clipping\n\n last = slice[slice.length - 1];\n if (closed && last && (slice[0][0] !== last[0] || slice[0][1] !== last[1])) { slice.push(slice[0]); }\n\n // add the final slice\n newSlice(slices, slice, area, dist, outer);\n }\n\n return slices;\n}\n\nfunction newSlice(slices, slice, area, dist, outer) {\n if (slice.length) {\n // we don't recalculate the area/length of the unclipped geometry because the case where it goes\n // below the visibility threshold as a result of clipping is rare, so we avoid doing unnecessary work\n slice.area = area;\n slice.dist = dist;\n if (outer !== undefined) { slice.outer = outer; }\n\n slices.push(slice);\n }\n return [];\n}\n\nvar clip$2 = clip_1;\n\nvar wrap_1 = wrap$1;\n\nfunction wrap$1(features, buffer, intersectX) {\n var merged = features,\n left = clip$2(features, 1, -1 - buffer, buffer, 0, intersectX, -1, 2), // left world copy\n right = clip$2(features, 1, 1 - buffer, 2 + buffer, 0, intersectX, -1, 2); // right world copy\n\n if (left || right) {\n merged = clip$2(features, 1, -buffer, 1 + buffer, 0, intersectX, -1, 2); // center world copy\n\n if (left) { merged = shiftFeatureCoords(left, 1).concat(merged); } // merge left into center\n if (right) { merged = merged.concat(shiftFeatureCoords(right, -1)); } // merge right into center\n }\n\n return merged;\n}\n\nfunction shiftFeatureCoords(features, offset) {\n var newFeatures = [];\n\n for (var i = 0; i < features.length; i++) {\n var feature = features[i],\n type = feature.type;\n\n var newGeometry;\n\n if (type === 1) {\n newGeometry = shiftCoords(feature.geometry, offset);\n } else {\n newGeometry = [];\n for (var j = 0; j < feature.geometry.length; j++) {\n newGeometry.push(shiftCoords(feature.geometry[j], offset));\n }\n }\n\n newFeatures.push({\n geometry: newGeometry,\n type: type,\n tags: feature.tags,\n min: [feature.min[0] + offset, feature.min[1]],\n max: [feature.max[0] + offset, feature.max[1]]\n });\n }\n\n return newFeatures;\n}\n\nfunction shiftCoords(points, offset) {\n var newPoints = [];\n newPoints.area = points.area;\n newPoints.dist = points.dist;\n\n for (var i = 0; i < points.length; i++) {\n newPoints.push([points[i][0] + offset, points[i][1], points[i][2]]);\n }\n return newPoints;\n}\n\nvar tile$1 = createTile$1;\n\nfunction createTile$1(features, z2, tx, ty, tolerance, noSimplify) {\n var tile = {\n features: [],\n numPoints: 0,\n numSimplified: 0,\n numFeatures: 0,\n source: null,\n x: tx,\n y: ty,\n z2: z2,\n transformed: false,\n min: [2, 1],\n max: [-1, 0]\n };\n for (var i = 0; i < features.length; i++) {\n tile.numFeatures++;\n addFeature(tile, features[i], tolerance, noSimplify);\n\n var min = features[i].min,\n max = features[i].max;\n\n if (min[0] < tile.min[0]) { tile.min[0] = min[0]; }\n if (min[1] < tile.min[1]) { tile.min[1] = min[1]; }\n if (max[0] > tile.max[0]) { tile.max[0] = max[0]; }\n if (max[1] > tile.max[1]) { tile.max[1] = max[1]; }\n }\n return tile;\n}\n\nfunction addFeature(tile, feature, tolerance, noSimplify) {\n\n var geom = feature.geometry,\n type = feature.type,\n simplified = [],\n sqTolerance = tolerance * tolerance,\n i, j, ring, p;\n\n if (type === 1) {\n for (i = 0; i < geom.length; i++) {\n simplified.push(geom[i]);\n tile.numPoints++;\n tile.numSimplified++;\n }\n\n } else {\n\n // simplify and transform projected coordinates for tile geometry\n for (i = 0; i < geom.length; i++) {\n ring = geom[i];\n\n // filter out tiny polylines & polygons\n if (!noSimplify && ((type === 2 && ring.dist < tolerance) ||\n (type === 3 && ring.area < sqTolerance))) {\n tile.numPoints += ring.length;\n continue;\n }\n\n var simplifiedRing = [];\n\n for (j = 0; j < ring.length; j++) {\n p = ring[j];\n // keep points with importance > tolerance\n if (noSimplify || p[2] > sqTolerance) {\n simplifiedRing.push(p);\n tile.numSimplified++;\n }\n tile.numPoints++;\n }\n\n if (type === 3) { rewind(simplifiedRing, ring.outer); }\n\n simplified.push(simplifiedRing);\n }\n }\n\n if (simplified.length) {\n tile.features.push({\n geometry: simplified,\n type: type,\n tags: feature.tags || null\n });\n }\n}\n\nfunction rewind(ring, clockwise) {\n var area = signedArea(ring);\n if (area < 0 === clockwise) { ring.reverse(); }\n}\n\nfunction signedArea(ring) {\n var sum = 0;\n for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n p1 = ring[i];\n p2 = ring[j];\n sum += (p2[0] - p1[0]) * (p1[1] + p2[1]);\n }\n return sum;\n}\n\nvar index = geojsonvt;\n\nvar convert = convert_1;\nvar transform = transform$1;\nvar clip = clip_1;\nvar wrap = wrap_1;\nvar createTile = tile$1; // final simplified tile generation\n\n\nfunction geojsonvt(data, options) {\n return new GeoJSONVT(data, options);\n}\n\nfunction GeoJSONVT(data, options) {\n options = this.options = extend(Object.create(this.options), options);\n\n var debug = options.debug;\n\n if (debug) { console.time('preprocess data'); }\n\n var z2 = 1 << options.maxZoom, // 2^z\n features = convert(data, options.tolerance / (z2 * options.extent));\n\n this.tiles = {};\n this.tileCoords = [];\n\n if (debug) {\n console.timeEnd('preprocess data');\n console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints);\n console.time('generate tiles');\n this.stats = {};\n this.total = 0;\n }\n\n features = wrap(features, options.buffer / options.extent, intersectX);\n\n // start slicing from the top tile down\n if (features.length) { this.splitTile(features, 0, 0, 0); }\n\n if (debug) {\n if (features.length) { console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints); }\n console.timeEnd('generate tiles');\n console.log('tiles generated:', this.total, JSON.stringify(this.stats));\n }\n}\n\nGeoJSONVT.prototype.options = {\n maxZoom: 14, // max zoom to preserve detail on\n indexMaxZoom: 5, // max zoom in the tile index\n indexMaxPoints: 100000, // max number of points per tile in the tile index\n solidChildren: false, // whether to tile solid square tiles further\n tolerance: 3, // simplification tolerance (higher means simpler)\n extent: 4096, // tile extent\n buffer: 64, // tile buffer on each side\n debug: 0 // logging level (0, 1 or 2)\n};\n\nGeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) {\n var this$1 = this;\n\n\n var stack = [features, z, x, y],\n options = this.options,\n debug = options.debug,\n solid = null;\n\n // avoid recursion by using a processing queue\n while (stack.length) {\n y = stack.pop();\n x = stack.pop();\n z = stack.pop();\n features = stack.pop();\n\n var z2 = 1 << z,\n id = toID(z, x, y),\n tile = this$1.tiles[id],\n tileTolerance = z === options.maxZoom ? 0 : options.tolerance / (z2 * options.extent);\n\n if (!tile) {\n if (debug > 1) { console.time('creation'); }\n\n tile = this$1.tiles[id] = createTile(features, z2, x, y, tileTolerance, z === options.maxZoom);\n this$1.tileCoords.push({z: z, x: x, y: y});\n\n if (debug) {\n if (debug > 1) {\n console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)',\n z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified);\n console.timeEnd('creation');\n }\n var key = 'z' + z;\n this$1.stats[key] = (this$1.stats[key] || 0) + 1;\n this$1.total++;\n }\n }\n\n // save reference to original geometry in tile so that we can drill down later if we stop now\n tile.source = features;\n\n // if it's the first-pass tiling\n if (!cz) {\n // stop tiling if we reached max zoom, or if the tile is too simple\n if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) { continue; }\n\n // if a drilldown to a specific tile\n } else {\n // stop tiling if we reached base zoom or our target tile zoom\n if (z === options.maxZoom || z === cz) { continue; }\n\n // stop tiling if it's not an ancestor of the target tile\n var m = 1 << (cz - z);\n if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) { continue; }\n }\n\n // stop tiling if the tile is solid clipped square\n if (!options.solidChildren && isClippedSquare(tile, options.extent, options.buffer)) {\n if (cz) { solid = z; } // and remember the zoom if we're drilling down\n continue;\n }\n\n // if we slice further down, no need to keep source geometry\n tile.source = null;\n\n if (debug > 1) { console.time('clipping'); }\n\n // values we'll use for clipping\n var k1 = 0.5 * options.buffer / options.extent,\n k2 = 0.5 - k1,\n k3 = 0.5 + k1,\n k4 = 1 + k1,\n tl, bl, tr, br, left, right;\n\n tl = bl = tr = br = null;\n\n left = clip(features, z2, x - k1, x + k3, 0, intersectX, tile.min[0], tile.max[0]);\n right = clip(features, z2, x + k2, x + k4, 0, intersectX, tile.min[0], tile.max[0]);\n\n if (left) {\n tl = clip(left, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]);\n bl = clip(left, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]);\n }\n\n if (right) {\n tr = clip(right, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]);\n br = clip(right, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]);\n }\n\n if (debug > 1) { console.timeEnd('clipping'); }\n\n if (tl) { stack.push(tl, z + 1, x * 2, y * 2); }\n if (bl) { stack.push(bl, z + 1, x * 2, y * 2 + 1); }\n if (tr) { stack.push(tr, z + 1, x * 2 + 1, y * 2); }\n if (br) { stack.push(br, z + 1, x * 2 + 1, y * 2 + 1); }\n }\n\n return solid;\n};\n\nGeoJSONVT.prototype.getTile = function (z, x, y) {\n var this$1 = this;\n\n var options = this.options,\n extent = options.extent,\n debug = options.debug;\n\n var z2 = 1 << z;\n x = ((x % z2) + z2) % z2; // wrap tile x coordinate\n\n var id = toID(z, x, y);\n if (this.tiles[id]) { return transform.tile(this.tiles[id], extent); }\n\n if (debug > 1) { console.log('drilling down to z%d-%d-%d', z, x, y); }\n\n var z0 = z,\n x0 = x,\n y0 = y,\n parent;\n\n while (!parent && z0 > 0) {\n z0--;\n x0 = Math.floor(x0 / 2);\n y0 = Math.floor(y0 / 2);\n parent = this$1.tiles[toID(z0, x0, y0)];\n }\n\n if (!parent || !parent.source) { return null; }\n\n // if we found a parent tile containing the original geometry, we can drill down from it\n if (debug > 1) { console.log('found parent tile z%d-%d-%d', z0, x0, y0); }\n\n // it parent tile is a solid clipped square, return it instead since it's identical\n if (isClippedSquare(parent, extent, options.buffer)) { return transform.tile(parent, extent); }\n\n if (debug > 1) { console.time('drilling down'); }\n var solid = this.splitTile(parent.source, z0, x0, y0, z, x, y);\n if (debug > 1) { console.timeEnd('drilling down'); }\n\n // one of the parent tiles was a solid clipped square\n if (solid !== null) {\n var m = 1 << (z - solid);\n id = toID(solid, Math.floor(x / m), Math.floor(y / m));\n }\n\n return this.tiles[id] ? transform.tile(this.tiles[id], extent) : null;\n};\n\nfunction toID(z, x, y) {\n return (((1 << z) * y + x) * 32) + z;\n}\n\nfunction intersectX(a, b, x) {\n return [x, (x - a[0]) * (b[1] - a[1]) / (b[0] - a[0]) + a[1], 1];\n}\nfunction intersectY(a, b, y) {\n return [(y - a[1]) * (b[0] - a[0]) / (b[1] - a[1]) + a[0], y, 1];\n}\n\nfunction extend(dest, src) {\n for (var i in src) { dest[i] = src[i]; }\n return dest;\n}\n\n// checks whether a tile is a whole-area fill after clipping; if it is, there's no sense slicing it further\nfunction isClippedSquare(tile, extent, buffer) {\n\n var features = tile.source;\n if (features.length !== 1) { return false; }\n\n var feature = features[0];\n if (feature.type !== 3 || feature.geometry.length > 1) { return false; }\n\n var len = feature.geometry[0].length;\n if (len !== 5) { return false; }\n\n for (var i = 0; i < len; i++) {\n var p = transform.point(feature.geometry[0][i], extent, tile.z2, tile.x, tile.y);\n if ((p[0] !== -buffer && p[0] !== extent + buffer) ||\n (p[1] !== -buffer && p[1] !== extent + buffer)) { return false; }\n }\n\n return true;\n}\n\nvar identity = function(x) {\n return x;\n};\n\nvar transform$3 = function(topology) {\n if ((transform = topology.transform) == null) { return identity; }\n var transform,\n x0,\n y0,\n kx = transform.scale[0],\n ky = transform.scale[1],\n dx = transform.translate[0],\n dy = transform.translate[1];\n return function(point, i) {\n if (!i) { x0 = y0 = 0; }\n point[0] = (x0 += point[0]) * kx + dx;\n point[1] = (y0 += point[1]) * ky + dy;\n return point;\n };\n};\n\nvar bbox = function(topology) {\n var bbox = topology.bbox;\n\n function bboxPoint(p0) {\n p1[0] = p0[0], p1[1] = p0[1], t(p1);\n if (p1[0] < x0) { x0 = p1[0]; }\n if (p1[0] > x1) { x1 = p1[0]; }\n if (p1[1] < y0) { y0 = p1[1]; }\n if (p1[1] > y1) { y1 = p1[1]; }\n }\n\n function bboxGeometry(o) {\n switch (o.type) {\n case \"GeometryCollection\": o.geometries.forEach(bboxGeometry); break;\n case \"Point\": bboxPoint(o.coordinates); break;\n case \"MultiPoint\": o.coordinates.forEach(bboxPoint); break;\n }\n }\n\n if (!bbox) {\n var t = transform$3(topology), p0, p1 = new Array(2), name,\n x0 = Infinity, y0 = x0, x1 = -x0, y1 = -x0;\n\n topology.arcs.forEach(function(arc) {\n var i = -1, n = arc.length;\n while (++i < n) {\n p0 = arc[i], p1[0] = p0[0], p1[1] = p0[1], t(p1, i);\n if (p1[0] < x0) { x0 = p1[0]; }\n if (p1[0] > x1) { x1 = p1[0]; }\n if (p1[1] < y0) { y0 = p1[1]; }\n if (p1[1] > y1) { y1 = p1[1]; }\n }\n });\n\n for (name in topology.objects) {\n bboxGeometry(topology.objects[name]);\n }\n\n bbox = topology.bbox = [x0, y0, x1, y1];\n }\n\n return bbox;\n};\n\nvar reverse = function(array, n) {\n var t, j = array.length, i = j - n;\n while (i < --j) { t = array[i], array[i++] = array[j], array[j] = t; }\n};\n\nvar feature = function(topology, o) {\n return o.type === \"GeometryCollection\"\n ? {type: \"FeatureCollection\", features: o.geometries.map(function(o) { return feature$1(topology, o); })}\n : feature$1(topology, o);\n};\n\nfunction feature$1(topology, o) {\n var id = o.id,\n bbox = o.bbox,\n properties = o.properties == null ? {} : o.properties,\n geometry = object(topology, o);\n return id == null && bbox == null ? {type: \"Feature\", properties: properties, geometry: geometry}\n : bbox == null ? {type: \"Feature\", id: id, properties: properties, geometry: geometry}\n : {type: \"Feature\", id: id, bbox: bbox, properties: properties, geometry: geometry};\n}\n\nfunction object(topology, o) {\n var transformPoint = transform$3(topology),\n arcs = topology.arcs;\n\n function arc(i, points) {\n if (points.length) { points.pop(); }\n for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k) {\n points.push(transformPoint(a[k].slice(), k));\n }\n if (i < 0) { reverse(points, n); }\n }\n\n function point(p) {\n return transformPoint(p.slice());\n }\n\n function line(arcs) {\n var points = [];\n for (var i = 0, n = arcs.length; i < n; ++i) { arc(arcs[i], points); }\n if (points.length < 2) { points.push(points[0].slice()); }\n return points;\n }\n\n function ring(arcs) {\n var points = line(arcs);\n while (points.length < 4) { points.push(points[0].slice()); }\n return points;\n }\n\n function polygon(arcs) {\n return arcs.map(ring);\n }\n\n function geometry(o) {\n var type = o.type, coordinates;\n switch (type) {\n case \"GeometryCollection\": return {type: type, geometries: o.geometries.map(geometry)};\n case \"Point\": coordinates = point(o.coordinates); break;\n case \"MultiPoint\": coordinates = o.coordinates.map(point); break;\n case \"LineString\": coordinates = line(o.arcs); break;\n case \"MultiLineString\": coordinates = o.arcs.map(line); break;\n case \"Polygon\": coordinates = polygon(o.arcs); break;\n case \"MultiPolygon\": coordinates = o.arcs.map(polygon); break;\n default: return null;\n }\n return {type: type, coordinates: coordinates};\n }\n\n return geometry(o);\n}\n\nvar stitch = function(topology, arcs) {\n var stitchedArcs = {},\n fragmentByStart = {},\n fragmentByEnd = {},\n fragments = [],\n emptyIndex = -1;\n\n // Stitch empty arcs first, since they may be subsumed by other arcs.\n arcs.forEach(function(i, j) {\n var arc = topology.arcs[i < 0 ? ~i : i], t;\n if (arc.length < 3 && !arc[1][0] && !arc[1][1]) {\n t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n }\n });\n\n arcs.forEach(function(i) {\n var e = ends(i),\n start = e[0],\n end = e[1],\n f, g;\n\n if (f = fragmentByEnd[start]) {\n delete fragmentByEnd[f.end];\n f.push(i);\n f.end = end;\n if (g = fragmentByStart[end]) {\n delete fragmentByStart[g.start];\n var fg = g === f ? f : f.concat(g);\n fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else if (f = fragmentByStart[end]) {\n delete fragmentByStart[f.start];\n f.unshift(i);\n f.start = start;\n if (g = fragmentByEnd[start]) {\n delete fragmentByEnd[g.end];\n var gf = g === f ? f : g.concat(f);\n fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else {\n f = [i];\n fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n }\n });\n\n function ends(i) {\n var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n if (topology.transform) { p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; }); }\n else { p1 = arc[arc.length - 1]; }\n return i < 0 ? [p1, p0] : [p0, p1];\n }\n\n function flush(fragmentByEnd, fragmentByStart) {\n for (var k in fragmentByEnd) {\n var f = fragmentByEnd[k];\n delete fragmentByStart[f.start];\n delete f.start;\n delete f.end;\n f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; });\n fragments.push(f);\n }\n }\n\n flush(fragmentByEnd, fragmentByStart);\n flush(fragmentByStart, fragmentByEnd);\n arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) { fragments.push([i]); } });\n\n return fragments;\n};\n\nfunction extractArcs(topology, object$$1, filter) {\n var arcs = [],\n geomsByArc = [],\n geom;\n\n function extract0(i) {\n var j = i < 0 ? ~i : i;\n (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom});\n }\n\n function extract1(arcs) {\n arcs.forEach(extract0);\n }\n\n function extract2(arcs) {\n arcs.forEach(extract1);\n }\n\n function extract3(arcs) {\n arcs.forEach(extract2);\n }\n\n function geometry(o) {\n switch (geom = o, o.type) {\n case \"GeometryCollection\": o.geometries.forEach(geometry); break;\n case \"LineString\": extract1(o.arcs); break;\n case \"MultiLineString\": case \"Polygon\": extract2(o.arcs); break;\n case \"MultiPolygon\": extract3(o.arcs); break;\n }\n }\n\n geometry(object$$1);\n\n geomsByArc.forEach(filter == null\n ? function(geoms) { arcs.push(geoms[0].i); }\n : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) { arcs.push(geoms[0].i); } });\n\n return arcs;\n}\n\nfunction planarRingArea(ring) {\n var i = -1, n = ring.length, a, b = ring[n - 1], area = 0;\n while (++i < n) { a = b, b = ring[i], area += a[0] * b[1] - a[1] * b[0]; }\n return Math.abs(area); // Note: doubled area!\n}\n\nvar bisect = function(a, x) {\n var lo = 0, hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (a[mid] < x) { lo = mid + 1; }\n else { hi = mid; }\n }\n return lo;\n};\n\nvar slicers = {};\nvar options;\n\nonmessage = function (e) {\n if (e.data[0] === 'slice') {\n // Given a blob of GeoJSON and some topojson/geojson-vt options, do the slicing.\n var geojson = e.data[1];\n options = e.data[2];\n\n if (geojson.type && geojson.type === 'Topology') {\n for (var layerName in geojson.objects) {\n slicers[layerName] = index(\n feature(geojson, geojson.objects[layerName])\n , options);\n }\n } else {\n slicers[options.vectorTileLayerName] = index(geojson, options);\n }\n\n } else if (e.data[0] === 'get') {\n // Gets the vector tile for the given coordinates, sends it back as a message\n var coords = e.data[1];\n\n var tileLayers = {};\n for (var layerName in slicers) {\n var slicedTileLayer = slicers[layerName].getTile(coords.z, coords.x, coords.y);\n\n if (slicedTileLayer) {\n var vectorTileLayer = {\n features: [],\n extent: options.extent,\n name: options.vectorTileLayerName,\n length: slicedTileLayer.features.length\n };\n\n for (var i in slicedTileLayer.features) {\n var feat = {\n geometry: slicedTileLayer.features[i].geometry,\n properties: slicedTileLayer.features[i].tags,\n type: slicedTileLayer.features[i].type // 1 = point, 2 = line, 3 = polygon\n };\n vectorTileLayer.features.push(feat);\n }\n tileLayers[layerName] = vectorTileLayer;\n }\n }\n postMessage({ layers: tileLayers, coords: coords });\n }\n};\n//# sourceMap" + "pingURL=slicerWebWorker.js.worker.map\n", "text/plain; charset=us-ascii", false); + +// The geojson/topojson is sliced into tiles via a web worker. +// This import statement depends on rollup-file-as-blob, so that the +// variable 'workerCode' is a blob URL. + +/* + * ??class VectorGrid.Slicer + * ??extends VectorGrid + * + * A `VectorGrid` for slicing up big GeoJSON or TopoJSON documents in vector + * tiles, leveraging [`geojson-vt`](https://github.com/mapbox/geojson-vt). + * + * ??example + * + * ``` + * var geoJsonDocument = { + * type: 'FeatureCollection', + * features: [ ... ] + * }; + * + * L.vectorGrid.slicer(geoJsonDocument, { + * vectorTileLayerStyles: { + * sliced: { ... } + * } + * }).addTo(map); + * + * ``` + * + * `VectorGrid.Slicer` can also handle [TopoJSON](https://github.com/mbostock/topojson) transparently: + * ```js + * var layer = L.vectorGrid.slicer(topojson, options); + * ``` + * + * The TopoJSON format [implicitly groups features into "objects"](https://github.com/mbostock/topojson-specification/blob/master/README.md#215-objects). + * These will be transformed into vector tile layer names when styling (the + * `vectorTileLayerName` option is ignored when using TopoJSON). + * + */ + +L.VectorGrid.Slicer = L.VectorGrid.extend({ + + options: { + // ??section + // Additionally to these options, `VectorGrid.Slicer` can take in any + // of the [`geojson-vt` options](https://github.com/mapbox/geojson-vt#options). + + // ??option vectorTileLayerName: String = 'sliced' + // Vector tiles contain a set of *data layers*, and those data layers + // contain features. Thus, the slicer creates one data layer, with + // the name given in this option. This is important for symbolizing the data. + vectorTileLayerName: 'sliced', + + extent: 4096, // Default for geojson-vt + maxZoom: 14 // Default for geojson-vt + }, + + initialize: function(geojson, options) { + L.VectorGrid.prototype.initialize.call(this, options); + + // Create a shallow copy of this.options, excluding things that might + // be functions - we only care about topojson/geojsonvt options + var options = {}; + for (var i in this.options) { + if (i !== 'rendererFactory' && + i !== 'vectorTileLayerStyles' && + typeof (this.options[i]) !== 'function' + ) { + options[i] = this.options[i]; + } + } + +// this._worker = new Worker(window.URL.createObjectURL(new Blob([workerCode]))); + this._worker = new Worker(workerCode); + + // Send initial data to worker. + this._worker.postMessage(['slice', geojson, options]); + + }, + + + _getVectorTilePromise: function(coords) { + + var _this = this; + + var p = new Promise( function waitForWorker(res) { + _this._worker.addEventListener('message', function recv(m) { + if (m.data.coords && + m.data.coords.x === coords.x && + m.data.coords.y === coords.y && + m.data.coords.z === coords.z ) { + + res(m.data); + _this._worker.removeEventListener('message', recv); + } + }); + }); + + this._worker.postMessage(['get', coords]); + + return p; + }, + +}); + + +L.vectorGrid.slicer = function (geojson, options) { + return new L.VectorGrid.Slicer(geojson, options); +}; + +L.Canvas.Tile = L.Canvas.extend({ + + initialize: function (tileCoord, tileSize, options) { + L.Canvas.prototype.initialize.call(this, options); + this._tileCoord = tileCoord; + this._size = tileSize; + + this._initContainer(); + this._container.setAttribute('width', this._size.x); + this._container.setAttribute('height', this._size.y); + this._layers = {}; + this._drawnLayers = {}; + this._drawing = true; + + if (options.interactive) { + // By default, Leaflet tiles do not have pointer events + this._container.style.pointerEvents = 'auto'; + } + }, + + getCoord: function() { + return this._tileCoord; + }, + + getContainer: function() { + return this._container; + }, + + getOffset: function() { + return this._tileCoord.scaleBy(this._size).subtract(this._map.getPixelOrigin()); + }, + + onAdd: L.Util.falseFn, + + addTo: function(map) { + this._map = map; + }, + + removeFrom: function (map) { + delete this._map; + }, + + _onClick: function (e) { + var point = this._map.mouseEventToLayerPoint(e).subtract(this.getOffset()), layer, clickedLayer; + + for (var id in this._layers) { + layer = this._layers[id]; + if (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) { + clickedLayer = layer; + } + } + if (clickedLayer) { + L.DomEvent.fakeStop(e); + this._fireEvent([clickedLayer], e); + } + }, + + _onMouseMove: function (e) { + if (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; } + + var point = this._map.mouseEventToLayerPoint(e).subtract(this.getOffset()); + this._handleMouseHover(e, point); + }, + + /// TODO: Modify _initPath to include an extra parameter, a group name + /// to order symbolizers by z-index + + _updateIcon: function (layer) { + if (!this._drawing) { return; } + + var icon = layer.options.icon, + options = icon.options, + size = L.point(options.iconSize), + anchor = options.iconAnchor || + size && size.divideBy(2, true), + p = layer._point.subtract(anchor), + ctx = this._ctx, + img = layer._getImage(); + + if (img.complete) { + ctx.drawImage(img, p.x, p.y, size.x, size.y); + } else { + L.DomEvent.on(img, 'load', function() { + ctx.drawImage(img, p.x, p.y, size.x, size.y); + }); + } + + this._drawnLayers[layer._leaflet_id] = layer; + } +}); + + +L.canvas.tile = function(tileCoord, tileSize, opts){ + return new L.Canvas.Tile(tileCoord, tileSize, opts); +}; + +// Aux file to bundle everything together, including the optional dependencies +// for protobuf tiles + +}()); +//# sourceMappingURL=Leaflet.VectorGrid.bundled.js.map diff --git a/js/OSMBuildings-Leaflet.js b/js/OSMBuildings-Leaflet.js new file mode 100644 index 0000000..904e0a5 --- /dev/null +++ b/js/OSMBuildings-Leaflet.js @@ -0,0 +1,48 @@ +(function(ca){function S(b,a){var c=b.x-a.x,d=b.y-a.y;return c*c+d*d}function va(b){var a=b.length;if(16>a)return!1;var c,d=Infinity,f=-Infinity,e=Infinity,g=-Infinity;for(c=0;cf||1.15g/e||1.2=a?90:1<=a?-90:(2*xa(ya(E* +(1-2*a)))-J)/E*180;c[d]=f;c[za]=360*(1===b?1:(b%1+1)%1)-180;return c}function da(b,a){var c=U(1,K(0,0.5-Aa(ka(Ba+J*b/180))/E/2));return{x:(a/360+0.5)*T<<0,y:c*T<<0}}function V(b){for(var a=B+p,c=v+n,d=0,f=b.length-3;dp&&b[d]n&&b[d+1]b[c].scale&&(b[c].scale+=0.1,1c&&(c+=1);1c?b:c<2/3?a+(b-a)*(2/3-c)*6:a}var c={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",grey:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",orange:"#ffa500",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00"},d=function(a,b, +c,d){this.H=a;this.S=b;this.L=c;this.A=d};d.parse=function(a){var b=0,d=0,h=0,k=1,m;a=(""+a).toLowerCase();a=c[a]||a;if(m=a.match(/^#(\w{2})(\w{2})(\w{2})$/))b=parseInt(m[1],16),d=parseInt(m[2],16),h=parseInt(m[3],16);else if(m=a.match(/rgba?\((\d+)\D+(\d+)\D+(\d+)(\D+([\d.]+))?\)/))b=parseInt(m[1],10),d=parseInt(m[2],10),h=parseInt(m[3],10),k=m[4]?parseFloat(m[5]):1;else return;return this.fromRGBA(b,d,h,k)};d.fromRGBA=function(a,b,c,h){"object"===typeof a?(b=a.g/255,c=a.b/255,h=a.a,a=a.r/255):(a/= +255,b/=255,c/=255);var k=Math.max(a,b,c),m=Math.min(a,b,c),l,y=(k+m)/2,s=k-m;if(s){m=0.5d?d*(1+c):d+c-d*c,d=2*d-m,b=b/360,c=a(d,m,b+1/3);k=a(d,m,b);b= +a(d,m,b-1/3)}return{r:Math.round(255*c),g:Math.round(255*k),b:Math.round(255*b),a:h}},toString:function(){var a=this.toRGBA();return 1===a.a?"#"+(16777216+(a.r<<16)+(a.g<<8)+a.b).toString(16).slice(1,7):"rgba("+[a.r,a.g,a.b,a.a.toFixed(2)].join()+")"},hue:function(a){return new d(this.H*a,this.S,this.L,this.A)},saturation:function(a){return new d(this.H,this.S*a,this.L,this.A)},lightness:function(a){return new d(this.H,this.S,this.L*a,this.A)},alpha:function(a){return new d(this.H,this.S,this.L,this.A* +a)}};return d}(this),Ha=function(){var b=Math,a=b.PI,c=b.sin,d=b.cos,f=b.tan,e=b.asin,g=b.atan2,h=a/180,k=23.4397*h;return function(b,l,y){y=h*-y;l*=h;b=b.valueOf()/864E5-0.5+2440588-2451545;var s=h*(357.5291+0.98560028*b),D;D=h*(1.9148*c(s)+0.02*c(2*s)+3E-4*c(3*s));D=s+D+102.9372*h+a;s=e(c(0)*d(k)+d(0)*c(k)*c(D));D=g(c(D)*d(k)-f(0)*c(k),d(D));b=h*(280.16+360.9856235*b)-y-D;y=e(c(l)*c(s)+d(l)*d(s)*d(b));l=g(c(b),d(b)*c(l)-f(s)*d(l));return{altitude:y,azimuth:l-a/2}}}(),Ja=function(){function b(a){a= +a.toLowerCase();return"#"===a[0]?a:d[f[a]||a]||null}function a(a,b){var c,d,f,s,D=0,p,n;p=0;for(n=a.length-3;ph.status||299f;)k=c.shift(),d-=k.size,delete a[k.url]}};h.open("GET",b);h.send(null);return h}}var a={},c=[],d=0,f=5242880;return{loadJSON:function(a,c){return b(a,function(a){var b;try{b= +JSON.parse(a)}catch(d){}c(b)})}}}(),F={loadedItems:{},items:[],getPixelFootprint:function(b){for(var a=new ra(b.length),c,d=0,f=b.length-1;dg&&(k=e,g=h)}2a.length))return a},resetItems:function(){this.items=[];this.loadedItems={};Y.reset()},addRenderItems:function(b,a){for(var c,d,f,e=Ja.read(b),g=0,h=e.length;gga)&&(a.footprint=this.getPixelFootprint(b.footprint),a.footprint)){for(var d=a.footprint,f=Infinity,e=-Infinity,g=Infinity,h=-Infinity,k=0,m=d.length-3;k>16-x,c=p/a<<0, +d=n/a<<0,f=qa((p+B)/a),a=qa((n+v)/a),e,g=this;for(e=d;e<=a;e++)for(d=c;d<=f;d++)this.loadTile(d,e,16,b)}},loadTile:function(b,a,c,d){b=this.src.replace("{s}","abcd"[(b+a)%4]).replace("{x}",b).replace("{y}",a).replace("{z}",c);return Ka.loadJSON(b,d)}},Z={draw:function(b,a,c,d,f,e,g,h){var k,m=this._extrude(b,a,d,f,e,g),l=[];if(c)for(a=0,k=c.length;a(m.x-h.x)*(k.y-h.y)&&(b.fillStyle=h.xk.x&&h.y>k.y?e:f,b.beginPath(),this._ring(b,[k.x,k.y,h.x,h.y,m.x,m.y,l.x,l.y]),b.closePath(),b.fill()),y[s]=m.x,y[s+1]=m.y;return y},_ring:function(b,a){b.moveTo(a[0], +a[1]);for(var c=2,d=a.length-1;c(k.x-g.x)*(h.y-g.y)?(1===e&&b.lineTo(g.x,g.y),e=0,l||b.moveTo(g.x,g.y),b.lineTo(h.x,h.y)):(0===e&&b.lineTo(k.x,k.y),e=1,l||b.moveTo(k.x,k.y),b.lineTo(m.x,m.y));if(c)for(l=0,q=c.length;l(e.x-g.x)*(h.y-g.y)?(1===c&&b.lineTo(g.x,g.y),c=0,l||b.moveTo(g.x,g.y),b.lineTo(h.x,h.y)):(0===c&&b.lineTo(e.x,e.y),c=1,l||b.moveTo(e.x,e.y),b.lineTo(m.x,m.y));b.closePath();b.fill()}},w={draw:function(b,a,c,d,f,e,g,h,k){a={x:a.x-p,y:a.y-n};var m=q/(q-f),l=q/(q-e);f=r.project(a,m);d*=m;e&&(a=r.project(a,l),c*=l);(m=this._tangents(a, +c,f,d))?(e=P(m[0].y1-a.y,m[0].x1-a.x),m=P(m[1].y1-a.y,m[1].x1-a.x)):(e=1.5*E,m=1.5*E);b.fillStyle=g;b.beginPath();b.arc(f.x,f.y,d,J,e,!0);b.arc(a.x,a.y,c,e,J);b.closePath();b.fill();b.fillStyle=h;b.beginPath();b.arc(f.x,f.y,d,m,J,!0);b.arc(a.x,a.y,c,J,m);b.closePath();b.fill();b.fillStyle=k;this._circle(b,f,d)},simplified:function(b,a,c){this._circle(b,{x:a.x-p,y:a.y-n},c)},shadow:function(b,a,c,d,f,e){a={x:a.x-p,y:a.y-n};f=z.project(a,f);var g;e&&(a=z.project(a,e));var h=this._tangents(a,c,f,d); +h?(e=P(h[0].y1-a.y,h[0].x1-a.x),g=P(h[1].y1-a.y,h[1].x1-a.x),b.moveTo(h[1].x2,h[1].y2),b.arc(f.x,f.y,d,g,e),b.arc(a.x,a.y,c,e,g)):(b.moveTo(a.x+c,a.y),b.arc(a.x,a.y,c,0,2*E))},shadowMask:function(b,a,c){var d=a.x-p;a=a.y-n;b.moveTo(d+c,a);b.arc(d,a,c,0,2*E)},hitArea:function(b,a,c,d,f,e,g){a={x:a.x-p,y:a.y-n};var h=q/(q-f),k=q/(q-e);f=r.project(a,h);d*=h;e&&(a=r.project(a,k),c*=k);e=this._tangents(a,c,f,d);b.fillStyle=g;b.beginPath();e?(g=P(e[0].y1-a.y,e[0].x1-a.x),h=P(e[1].y1-a.y,e[1].x1-a.x),b.moveTo(e[1].x2, +e[1].y2),b.arc(f.x,f.y,d,h,g),b.arc(a.x,a.y,c,g,h)):(b.moveTo(a.x+c,a.y),b.arc(a.x,a.y,c,0,2*E));b.closePath();b.fill()},_circle:function(b,a,c){b.beginPath();b.arc(a.x,a.y,c,0,2*E);b.stroke();b.fill()},_tangents:function(b,a,c,d){var f=b.x-c.x,e=b.y-c.y,g=a-d,h=f*f+e*e;if(!(h<=g*g)){var h=pa(h),f=-f/h,e=-e/h,g=g/h,h=[],k,m,l;k=pa(K(0,1-g*g));for(var n=1;-1<=n;n-=2)m=f*g-n*k*e,l=e*g+n*k*f,h.push({x1:b.x+a*m<<0,y1:b.y+a*l<<0,x2:c.x+d*m<<0,y2:c.y+d*l<<0});return h}}},R={draw:function(b,a,c,d,f,e,g){var h= +q/(q-f);c=r.project({x:c.x-p,y:c.y-n},q/(q-d));d={x:0,y:0};for(var k={x:0,y:0},m=0,l=a.length-3;m(c.x-d.x)*(k.y-d.y)&&(b.fillStyle=d.xk.x&&d.y>k.y?g:e,b.beginPath(),this._triangle(b,d,k,c),b.closePath(),b.fill())},_triangle:function(b,a,c,d){b.moveTo(a.x,a.y);b.lineTo(c.x,c.y);b.lineTo(d.x,d.y)},_ring:function(b,a){b.moveTo(a[0]-p,a[1]-n);for(var c=2,d=a.length-1;c< +d;c+=2)b.lineTo(a[c]-p,a[c+1]-n)},shadow:function(b,a,c,d,f){var e={x:0,y:0},g={x:0,y:0};c=z.project({x:c.x-p,y:c.y-n},d);d=0;for(var h=a.length-3;d(c.x-e.x)*(g.y-e.y)&&this._triangle(b,e,g,c)},shadowMask:function(b,a){this._ring(b,a)},hitArea:function(b,a,c,d,f,e){var g=q/(q-f);c=r.project({x:c.x-p,y:c.y-n},q/(q-d));d={x:0,y:0};var h={x:0,y:0};b.fillStyle=e;b.beginPath();e=0;for(var k= +a.length-3;e(c.x-d.x)*(h.y-d.y)&&this._triangle(b,d,h,c);b.closePath();b.fill()}},r={project:function(b,a){return{x:(b.x-M)*a+M<<0,y:(b.y-N)*a+N<<0}},render:function(){var b=this.context;b.clearRect(0,0,B,v);if(!(xa.scale?a.height*a.scale:a.height;d=0;a.minHeight&&(d=1>a.scale?a.minHeight*a.scale:a.minHeight);g=a.wallColor||ha;h=a.altColor||aa;k=a.roofColor||X;b.strokeStyle=h;switch(a.shape){case "cylinder":w.draw(b,a.center,a.radius,a.radius,c,d,g,h,k);break;case "cone":w.draw(b,a.center,a.radius,0,c,d,g,h);break;case "dome":w.draw(b,a.center,a.radius,a.radius/2,c,d,g,h);break;case "sphere":w.draw(b,a.center,a.radius,a.radius,c,d,g,h,k);break;case "pyramid":R.draw(b, +e,a.center,c,d,g,h);break;default:Z.draw(b,e,a.holes,c,d,g,h,k)}switch(a.roofShape){case "cone":w.draw(b,a.center,a.radius,0,c+a.roofHeight,c,k,""+I.parse(k).lightness(0.9));break;case "dome":w.draw(b,a.center,a.radius,a.radius/2,c+a.roofHeight,c,k,""+I.parse(k).lightness(0.9));break;case "pyramid":R.draw(b,e,a.center,c+a.roofHeight,c,k,I.parse(k).lightness(0.9))}}}}},ia={maxZoom:G+2,maxHeight:5,isSimple:function(b){return x<=this.maxZoom&&b.height+b.roofHeightthis.maxZoom))for(var a,c,d=F.items,f=0,e=d.length;f=this.maxHeight)&&(c=a.footprint,V(c)))switch(b.strokeStyle=a.altColor||aa,b.fillStyle=a.roofColor||X,a.shape){case "cylinder":case "cone":case "dome":case "sphere":w.simplified(b,a.center,a.radius);break;default:Z.simplified(b,c,a.holes)}}},z={enabled:!0,color:"#666666",blurColor:"#000000",blurSize:15,date:new Date,direction:{x:0,y:0},project:function(b,a){return{x:b.x+ +this.direction.x*a,y:b.y+this.direction.y*a}},render:function(){var b=this.context,a,c,d;b.clearRect(0,0,B,v);if(!(!this.enabled||x=a.altitude))){c=1/ka(a.altitude);d=5>c?0.75:1/c*5;this.direction.x=Fa(a.azimuth)*c;this.direction.y=Ea(a.azimuth)*c;var f,e,g,h;a=F.items;b.canvas.style.opacity=d/(2*C);b.shadowColor=this.blurColor;b.shadowBlur=C/2*this.blurSize;b.fillStyle=this.color;b.beginPath();d=0;for(c=a.length;df.scale?f.height*f.scale:f.height;g=0;f.minHeight&&(g=1>f.scale?f.minHeight*f.scale:f.minHeight);switch(f.shape){case "cylinder":w.shadow(b,f.center,f.radius,f.radius,e,g);break;case "cone":w.shadow(b,f.center,f.radius,0,e,g);break;case "dome":w.shadow(b,f.center,f.radius,f.radius/2,e,g);break;case "sphere":w.shadow(b,f.center,f.radius,f.radius,e,g);break;case "pyramid":R.shadow(b,h,f.center,e,g);break;default:Z.shadow(b,h,f.holes,e,g)}switch(f.roofShape){case "cone":w.shadow(b, +f.center,f.radius,0,e+f.roofHeight,e);break;case "dome":w.shadow(b,f.center,f.radius,f.radius/2,e+f.roofHeight,e);break;case "pyramid":R.shadow(b,h,f.center,e+f.roofHeight,e)}}b.closePath();b.fill();b.shadowBlur=null;b.globalCompositeOperation="destination-out";b.beginPath();d=0;for(c=a.length;d>8&255,a>>16&255].join()+")"}}, +$,A={container:document.createElement("DIV"),items:[],init:function(){this.container.style.pointerEvents="none";this.container.style.position="absolute";this.container.style.left=0;this.container.style.top=0;z.context=this.createContext(this.container);ia.context=this.createContext(this.container);r.context=this.createContext(this.container);Y.context=this.createContext()},render:function(b){Ga(function(){b||(z.render(),ia.render(),Y.render());r.render()})},createContext:function(b){var a=document.createElement("CANVAS"); +a.style.transform="translate3d(0, 0, 0)";a.style.imageRendering="optimizeSpeed";a.style.position="absolute";a.style.left=0;a.style.top=0;var c=a.getContext("2d");c.lineCap="round";c.lineJoin="round";c.lineWidth=1;c.imageSmoothingEnabled=!1;this.items.push(a);b&&b.appendChild(a);return c},appendTo:function(b){b.appendChild(this.container)},remove:function(){this.container.parentNode.removeChild(this.container)},setSize:function(b,a){for(var c=0,d=this.items.length;cOSM Buildings');F.update()};t.onRemove=function(){var b=this.map;b.attributionControl&&b.attributionControl.removeAttribution('© OSM Buildings');b.off({move:this.onMove, +moveend:this.onMoveEnd,zoomstart:this.onZoomStart,zoomend:this.onZoomEnd,resize:this.onResize,viewreset:this.onViewReset,click:this.onClick},this);b.options.zoomAnimation&&b.off("zoomanim",this.onZoom,this);A.remove()};t.onMove=function(b){b=this.getOffset();ea({x:this.offset.x-b.x,y:this.offset.y-b.y})};t.onMoveEnd=function(b){if(this.noMoveEnd)this.noMoveEnd=!1;else{var a=this.map;b=this.getOffset();var c=a.getPixelOrigin();this.offset=b;A.setPosition(-b.x,-b.y);ea({x:0,y:0});la({width:a._size.x, +height:a._size.y});a=c.y-b.y;p=c.x-b.x;n=a;A.render();F.update()}};t.onZoomStart=function(b){Q=!0;A.render()};t.onZoom=function(b){};t.onZoomEnd=function(b){b=this.map;var a=this.getOffset(),c=b.getPixelOrigin(),d=c.y-a.y;p=c.x-a.x;n=d;b=b._zoom;Q=!1;ma(b);F.update();A.render();this.noMoveEnd=!0};t.onResize=function(){};t.onViewReset=function(){var b=this.getOffset();this.offset=b;A.setPosition(-b.x,-b.y);ea({x:0,y:0})};t.onClick=function(b){var a=Y.getIdFromXY(b.containerPoint.x,b.containerPoint.y); +a&&ua({feature:a,lat:b.latlng.lat,lon:b.latlng.lng})};t.getOffset=function(){return L.DomUtil.getPosition(this.map._mapPane)};t.style=function(b){b=b||{};var a;if(a=b.color||b.wallColor)H=I.parse(a),ha=""+H.alpha(C),ba=H.lightness(0.8),aa=""+ba.alpha(C),O=H.lightness(1.2),X=""+O.alpha(C);b.roofColor&&(O=I.parse(b.roofColor),X=""+O.alpha(C));void 0!==b.shadows&&(z.enabled=!!b.shadows);A.render();return this};t.date=function(b){z.date=b;z.render();return this};t.load=function(b){F.load(b);return this}; +t.set=function(b){F.set(b);return this};var ta=function(){};t.each=function(b){ta=function(a){return b(a)};return this};var ua=function(){};t.click=function(b){ua=function(a){return b(a)};return this};u.VERSION="0.2.2b";u.ATTRIBUTION='© OSM Buildings';ca.OSMBuildings=u})(this); diff --git a/js/labelgun.min.js b/js/labelgun.min.js new file mode 100644 index 0000000..41eb5d4 --- /dev/null +++ b/js/labelgun.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("rbush")):"function"==typeof define&&define.amd?define(["rbush"],t):"object"==typeof exports?exports.labelgun=t(require("rbush")):e.labelgun=t(e.rbush)}(this,function(e){return function(e){function t(l){if(a[l])return a[l].exports;var n=a[l]={i:l,l:!1,exports:{}};return e[l].call(n.exports,n,n.exports,t),n.l=!0,n.exports}var a={};return t.m=e,t.c=a,t.d=function(e,a,l){t.o(e,a)||Object.defineProperty(e,a,{configurable:!1,enumerable:!0,get:l})},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,a){"use strict";function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t){for(var a=0;at.weight||a.isDragged)return!1;return!0}},{key:"_compare",value:function(e,t){return e.weight>t.weight?-1:e.weight0&&(this.hasChanged.forEach(function(t){e._handleLabelIngestion(t)}),this.hasChanged=[])}},{key:"_handleLabelIngestion",value:function(e){var t=this.allLabels[e];this.ingestLabel({bottomLeft:[t.minX,t.minY],topRight:[t.maxX,t.maxY]},t.id,t.weight,t.labelObject,t.name,t.isDragged)}},{key:"update",value:function(e){this.allChanged=!e,this._setupLabels(),this._compareLabels(),this._callLabelCallbacks()}},{key:"removeLabel",value:function(e){var t=this.allLabels[e];this.tree.remove(t),delete this.allLabels[e]}},{key:"_addToTree",value:function(e){this.allLabels[e.id]=e,this.tree.insert(e)}},{key:"ingestLabel",value:function(e,t,a,l,n,i){if(void 0!==a&&null!==a||(a=0),!e||!e.bottomLeft||!e.topRight)throw Error("Bounding box must be defined with bottomLeft and topRight properties");if("string"!=typeof t&&"number"!=typeof t)throw Error("Label IDs must be a string or a number");var s=this.allLabels[t];s&&this.removeLabel(s.id);var r={minX:e.bottomLeft[0],minY:e.bottomLeft[1],maxX:e.topRight[0],maxY:e.topRight[1],state:"hide",id:t,weight:a,labelObject:l,name:n,isDragged:i};this._addToTree(r)}},{key:"labelHasChanged",value:function(e){-1===this.hasChanged.indexOf(e)&&this.hasChanged.push(e)}}]),e}();t.default=r},function(t,a){t.exports=e}])}); \ No newline at end of file diff --git a/js/labels.js b/js/labels.js new file mode 100644 index 0000000..a9348f1 --- /dev/null +++ b/js/labels.js @@ -0,0 +1,62 @@ +var hideLabel = function(label) { + label.labelObject.style.opacity = 0; + label.labelObject.style.transition = 'opacity 0s'; +}; +var showLabel = function(label) { + label.labelObject.style.opacity = 1; + label.labelObject.style.transition = 'opacity 1s'; +}; +labelEngine = new labelgun.default(hideLabel, showLabel); + +var id = 0; +var labels = []; +var totalMarkers = 0; + +function resetLabels(markers) { + labelEngine.reset(); + var i = 0; + for (var j = 0; j < markers.length; j++) { + markers[j].eachLayer(function(label){ + addLabel(label, ++i); + }); + } + labelEngine.update(); +} + +function addLabel(layer, id) { + + // This is ugly but there is no getContainer method on the tooltip :( + if (layer.getTooltip()) { + var label = layer.getTooltip()._source._tooltip._container; + if (label) { + + // We need the bounding rectangle of the label itself + var rect = label.getBoundingClientRect(); + + // We convert the container coordinates (screen space) to Lat/lng + var bottomLeft = map.containerPointToLatLng([rect.left, rect.bottom]); + var topRight = map.containerPointToLatLng([rect.right, rect.top]); + var boundingBox = { + bottomLeft : [bottomLeft.lng, bottomLeft.lat], + topRight : [topRight.lng, topRight.lat] + }; + + // Ingest the label into labelgun itself + labelEngine.ingestLabel( + boundingBox, + id, + parseInt(Math.random() * (5 - 1) + 1), // Weight + label, + "Test " + id, + false + ); + + // If the label hasn't been added to the map already + // add it and set the added flag to true + if (!layer.added) { + layer.addTo(map); + layer.added = true; + } + } + } +} \ No newline at end of file diff --git a/js/leaflet-control-geocoder.Geocoder.js b/js/leaflet-control-geocoder.Geocoder.js new file mode 100644 index 0000000..202dbda --- /dev/null +++ b/js/leaflet-control-geocoder.Geocoder.js @@ -0,0 +1,1296 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.leafletControlGeocoder = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) { + this._alts.innerHTML = ''; + this._results = results; + L.DomUtil.removeClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized'); + for (var i = 0; i < results.length; i++) { + this._alts.appendChild(this._createAlt(results[i], i)); + } + } else { + L.DomUtil.addClass(this._errorElement, 'leaflet-control-geocoder-error'); + } + }, + + markGeocode: function(result) { + result = result.geocode || result; + + this._map.fitBounds(result.bbox); + + if (this._geocodeMarker) { + this._map.removeLayer(this._geocodeMarker); + } + + this._geocodeMarker = new L.Marker(result.center) + .bindPopup(result.html || result.name) + .addTo(this._map) + .openPopup(); + + return this; + }, + + _geocode: function(suggest) { + var requestCount = ++this._requestCount, + mode = suggest ? 'suggest' : 'geocode', + eventData = {input: this._input.value}; + + this._lastGeocode = this._input.value; + if (!suggest) { + this._clearResults(); + } + + this.fire('start' + mode, eventData); + this.options.geocoder[mode](this._input.value, function(results) { + if (requestCount === this._requestCount) { + eventData.results = results; + this.fire('finish' + mode, eventData); + this._geocodeResult(results, suggest); + } + }, this); + }, + + _geocodeResultSelected: function(result) { + this.fire('markgeocode', {geocode: result}); + }, + + _toggle: function() { + if (L.DomUtil.hasClass(this._container, 'leaflet-control-geocoder-expanded')) { + this._collapse(); + } else { + this._expand(); + } + }, + + _expand: function () { + L.DomUtil.addClass(this._container, 'leaflet-control-geocoder-expanded'); + this._input.select(); + this.fire('expand'); + }, + + _collapse: function () { + L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-expanded'); + L.DomUtil.addClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized'); + L.DomUtil.removeClass(this._errorElement, 'leaflet-control-geocoder-error'); + this._input.blur(); // mobile: keyboard shouldn't stay expanded + this.fire('collapse'); + }, + + _clearResults: function () { + L.DomUtil.addClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized'); + this._selection = null; + L.DomUtil.removeClass(this._errorElement, 'leaflet-control-geocoder-error'); + }, + + _createAlt: function(result, index) { + var li = L.DomUtil.create('li', ''), + a = L.DomUtil.create('a', '', li), + icon = this.options.showResultIcons && result.icon ? L.DomUtil.create('img', '', a) : null, + text = result.html ? undefined : document.createTextNode(result.name), + mouseDownHandler = function mouseDownHandler(e) { + // In some browsers, a click will fire on the map if the control is + // collapsed directly after mousedown. To work around this, we + // wait until the click is completed, and _then_ collapse the + // control. Messy, but this is the workaround I could come up with + // for #142. + this._preventBlurCollapse = true; + L.DomEvent.stop(e); + this._geocodeResultSelected(result); + L.DomEvent.on(li, 'click', function() { + if (this.options.collapsed) { + this._collapse(); + } else { + this._clearResults(); + } + }, this); + }; + + if (icon) { + icon.src = result.icon; + } + + li.setAttribute('data-result-index', index); + + if (result.html) { + a.innerHTML = a.innerHTML + result.html; + } else { + a.appendChild(text); + } + + // Use mousedown and not click, since click will fire _after_ blur, + // causing the control to have collapsed and removed the items + // before the click can fire. + L.DomEvent.addListener(li, 'mousedown touchstart', mouseDownHandler, this); + + return li; + }, + + _keydown: function(e) { + var _this = this, + select = function select(dir) { + if (_this._selection) { + L.DomUtil.removeClass(_this._selection, 'leaflet-control-geocoder-selected'); + _this._selection = _this._selection[dir > 0 ? 'nextSibling' : 'previousSibling']; + } + if (!_this._selection) { + _this._selection = _this._alts[dir > 0 ? 'firstChild' : 'lastChild']; + } + + if (_this._selection) { + L.DomUtil.addClass(_this._selection, 'leaflet-control-geocoder-selected'); + } + }; + + switch (e.keyCode) { + // Escape + case 27: + if (this.options.collapsed) { + this._collapse(); + } + break; + // Up + case 38: + select(-1); + break; + // Up + case 40: + select(1); + break; + // Enter + case 13: + if (this._selection) { + var index = parseInt(this._selection.getAttribute('data-result-index'), 10); + this._geocodeResultSelected(this._results[index]); + this._clearResults(); + } else { + this._geocode(); + } + break; + } + }, + _change: function(e) { + var v = this._input.value; + if (v !== this._lastGeocode) { + clearTimeout(this._suggestTimeout); + if (v.length >= this.options.suggestMinLength) { + this._suggestTimeout = setTimeout(L.bind(function() { + this._geocode(true); + }, this), this.options.suggestTimeout); + } else { + this._clearResults(); + } + } + } + }), + factory: function(options) { + return new L.Control.Geocoder(options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./geocoders/nominatim":9}],2:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + service_url: 'http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer' + }, + + initialize: function(accessToken, options) { + L.setOptions(this, options); + this._accessToken = accessToken; + }, + + geocode: function(query, cb, context) { + var params = { + SingleLine: query, + outFields: 'Addr_Type', + forStorage: false, + maxLocations: 10, + f: 'json' + }; + + if (this._key && this._key.length) { + params.token = this._key; + } + + Util.getJSON(this.options.service_url + '/findAddressCandidates', params, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + + if (data.candidates && data.candidates.length) { + for (var i = 0; i <= data.candidates.length - 1; i++) { + loc = data.candidates[i]; + latLng = L.latLng(loc.location.y, loc.location.x); + latLngBounds = L.latLngBounds(L.latLng(loc.extent.ymax, loc.extent.xmax), L.latLng(loc.extent.ymin, loc.extent.xmin)); + results[i] = { + name: loc.address, + bbox: latLngBounds, + center: latLng + }; + } + } + + cb.call(context, results); + }); + }, + + suggest: function(query, cb, context) { + return this.geocode(query, cb, context); + }, + + reverse: function(location, scale, cb, context) { + var params = { + location: encodeURIComponent(location.lng) + ',' + encodeURIComponent(location.lat), + distance: 100, + f: 'json' + }; + + Util.getJSON(this.options.service_url + '/reverseGeocode', params, function(data) { + var result = [], + loc; + + if (data && !data.error) { + loc = L.latLng(data.location.y, data.location.x); + result.push({ + name: data.address.Match_addr, + center: loc, + bounds: L.latLngBounds(loc, loc) + }); + } + + cb.call(context, result); + }); + } + }), + + factory: function(accessToken, options) { + return new L.Control.Geocoder.ArcGis(accessToken, options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],3:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + initialize: function(key) { + this.key = key; + }, + + geocode : function (query, cb, context) { + Util.jsonp('https://dev.virtualearth.net/REST/v1/Locations', { + query: query, + key : this.key + }, function(data) { + var results = []; + if( data.resourceSets.length > 0 ){ + for (var i = data.resourceSets[0].resources.length - 1; i >= 0; i--) { + var resource = data.resourceSets[0].resources[i], + bbox = resource.bbox; + results[i] = { + name: resource.name, + bbox: L.latLngBounds([bbox[0], bbox[1]], [bbox[2], bbox[3]]), + center: L.latLng(resource.point.coordinates) + }; + } + } + cb.call(context, results); + }, this, 'jsonp'); + }, + + reverse: function(location, scale, cb, context) { + Util.jsonp('//dev.virtualearth.net/REST/v1/Locations/' + location.lat + ',' + location.lng, { + key : this.key + }, function(data) { + var results = []; + for (var i = data.resourceSets[0].resources.length - 1; i >= 0; i--) { + var resource = data.resourceSets[0].resources[i], + bbox = resource.bbox; + results[i] = { + name: resource.name, + bbox: L.latLngBounds([bbox[0], bbox[1]], [bbox[2], bbox[3]]), + center: L.latLng(resource.point.coordinates) + }; + } + cb.call(context, results); + }, this, 'jsonp'); + } + }), + + factory: function(key) { + return new L.Control.Geocoder.Bing(key); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],4:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://maps.googleapis.com/maps/api/geocode/json', + geocodingQueryParams: {}, + reverseQueryParams: {} + }, + + initialize: function(key, options) { + this._key = key; + L.setOptions(this, options); + // Backwards compatibility + this.options.serviceUrl = this.options.service_url || this.options.serviceUrl; + }, + + geocode: function(query, cb, context) { + var params = { + address: query + }; + + if (this._key && this._key.length) { + params.key = this._key; + } + + params = L.Util.extend(params, this.options.geocodingQueryParams); + + Util.getJSON(this.options.serviceUrl, params, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + if (data.results && data.results.length) { + for (var i = 0; i <= data.results.length - 1; i++) { + loc = data.results[i]; + latLng = L.latLng(loc.geometry.location); + latLngBounds = L.latLngBounds(L.latLng(loc.geometry.viewport.northeast), L.latLng(loc.geometry.viewport.southwest)); + results[i] = { + name: loc.formatted_address, + bbox: latLngBounds, + center: latLng, + properties: loc.address_components + }; + } + } + + cb.call(context, results); + }); + }, + + reverse: function(location, scale, cb, context) { + var params = { + latlng: encodeURIComponent(location.lat) + ',' + encodeURIComponent(location.lng) + }; + params = L.Util.extend(params, this.options.reverseQueryParams); + if (this._key && this._key.length) { + params.key = this._key; + } + + Util.getJSON(this.options.serviceUrl, params, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + if (data.results && data.results.length) { + for (var i = 0; i <= data.results.length - 1; i++) { + loc = data.results[i]; + latLng = L.latLng(loc.geometry.location); + latLngBounds = L.latLngBounds(L.latLng(loc.geometry.viewport.northeast), L.latLng(loc.geometry.viewport.southwest)); + results[i] = { + name: loc.formatted_address, + bbox: latLngBounds, + center: latLng, + properties: loc.address_components + }; + } + } + + cb.call(context, results); + }); + } + }), + + factory: function(key, options) { + return new L.Control.Geocoder.Google(key, options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],5:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + geocodeUrl: 'http://geocoder.api.here.com/6.2/geocode.json', + reverseGeocodeUrl: 'http://reverse.geocoder.api.here.com/6.2/reversegeocode.json', + app_id: '', + app_code: '', + geocodingQueryParams: {}, + reverseQueryParams: {} + }, + + initialize: function(options) { + L.setOptions(this, options); + }, + + geocode: function(query, cb, context) { + var params = { + searchtext: query, + gen: 9, + app_id: this.options.app_id, + app_code: this.options.app_code, + jsonattributes: 1 + }; + params = L.Util.extend(params, this.options.geocodingQueryParams); + this.getJSON(this.options.geocodeUrl, params, cb, context); + }, + + reverse: function(location, scale, cb, context) { + var params = { + prox: encodeURIComponent(location.lat) + ',' + encodeURIComponent(location.lng), + mode: 'retrieveAddresses', + app_id: this.options.app_id, + app_code: this.options.app_code, + gen: 9, + jsonattributes: 1 + }; + params = L.Util.extend(params, this.options.reverseQueryParams); + this.getJSON(this.options.reverseGeocodeUrl, params, cb, context); + }, + + getJSON: function(url, params, cb, context) { + Util.getJSON(url, params, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + if (data.response.view && data.response.view.length) { + for (var i = 0; i <= data.response.view[0].result.length - 1; i++) { + loc = data.response.view[0].result[i].location; + latLng = L.latLng(loc.displayPosition.latitude, loc.displayPosition.longitude); + latLngBounds = L.latLngBounds(L.latLng(loc.mapView.topLeft.latitude, loc.mapView.topLeft.longitude), L.latLng(loc.mapView.bottomRight.latitude, loc.mapView.bottomRight.longitude)); + results[i] = { + name: loc.address.label, + bbox: latLngBounds, + center: latLng + }; + } + } + cb.call(context, results); + }) + } + }), + + factory: function(options) { + return new L.Control.Geocoder.HERE(options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],6:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://api.tiles.mapbox.com/v4/geocode/mapbox.places-v1/', + geocodingQueryParams: {}, + reverseQueryParams: {} + }, + + initialize: function(accessToken, options) { + L.setOptions(this, options); + this.options.geocodingQueryParams.access_token = accessToken; + this.options.reverseQueryParams.access_token = accessToken; + }, + + geocode: function(query, cb, context) { + var params = this.options.geocodingQueryParams; + if (typeof params.proximity !== 'undefined' + && params.proximity.hasOwnProperty('lat') + && params.proximity.hasOwnProperty('lng')) + { + params.proximity = params.proximity.lng + ',' + params.proximity.lat; + } + Util.getJSON(this.options.serviceUrl + encodeURIComponent(query) + '.json', params, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + if (data.features && data.features.length) { + for (var i = 0; i <= data.features.length - 1; i++) { + loc = data.features[i]; + latLng = L.latLng(loc.center.reverse()); + if (loc.hasOwnProperty('bbox')) + { + latLngBounds = L.latLngBounds(L.latLng(loc.bbox.slice(0, 2).reverse()), L.latLng(loc.bbox.slice(2, 4).reverse())); + } + else + { + latLngBounds = L.latLngBounds(latLng, latLng); + } + results[i] = { + name: loc.place_name, + bbox: latLngBounds, + center: latLng + }; + } + } + + cb.call(context, results); + }); + }, + + suggest: function(query, cb, context) { + return this.geocode(query, cb, context); + }, + + reverse: function(location, scale, cb, context) { + Util.getJSON(this.options.serviceUrl + encodeURIComponent(location.lng) + ',' + encodeURIComponent(location.lat) + '.json', this.options.reverseQueryParams, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + if (data.features && data.features.length) { + for (var i = 0; i <= data.features.length - 1; i++) { + loc = data.features[i]; + latLng = L.latLng(loc.center.reverse()); + if (loc.hasOwnProperty('bbox')) + { + latLngBounds = L.latLngBounds(L.latLng(loc.bbox.slice(0, 2).reverse()), L.latLng(loc.bbox.slice(2, 4).reverse())); + } + else + { + latLngBounds = L.latLngBounds(latLng, latLng); + } + results[i] = { + name: loc.place_name, + bbox: latLngBounds, + center: latLng + }; + } + } + + cb.call(context, results); + }); + } + }), + + factory: function(accessToken, options) { + return new L.Control.Geocoder.Mapbox(accessToken, options); + } +}; + + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],7:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://www.mapquestapi.com/geocoding/v1' + }, + + initialize: function(key, options) { + // MapQuest seems to provide URI encoded API keys, + // so to avoid encoding them twice, we decode them here + this._key = decodeURIComponent(key); + + L.Util.setOptions(this, options); + }, + + _formatName: function() { + var r = [], + i; + for (i = 0; i < arguments.length; i++) { + if (arguments[i]) { + r.push(arguments[i]); + } + } + + return r.join(', '); + }, + + geocode: function(query, cb, context) { + Util.jsonp(this.options.serviceUrl + '/address', { + key: this._key, + location: query, + limit: 5, + outFormat: 'json' + }, function(data) { + var results = [], + loc, + latLng; + if (data.results && data.results[0].locations) { + for (var i = data.results[0].locations.length - 1; i >= 0; i--) { + loc = data.results[0].locations[i]; + latLng = L.latLng(loc.latLng); + results[i] = { + name: this._formatName(loc.street, loc.adminArea4, loc.adminArea3, loc.adminArea1), + bbox: L.latLngBounds(latLng, latLng), + center: latLng + }; + } + } + + cb.call(context, results); + }, this); + }, + + reverse: function(location, scale, cb, context) { + Util.jsonp(this.options.serviceUrl + '/reverse', { + key: this._key, + location: location.lat + ',' + location.lng, + outputFormat: 'json' + }, function(data) { + var results = [], + loc, + latLng; + if (data.results && data.results[0].locations) { + for (var i = data.results[0].locations.length - 1; i >= 0; i--) { + loc = data.results[0].locations[i]; + latLng = L.latLng(loc.latLng); + results[i] = { + name: this._formatName(loc.street, loc.adminArea4, loc.adminArea3, loc.adminArea1), + bbox: L.latLngBounds(latLng, latLng), + center: latLng + }; + } + } + + cb.call(context, results); + }, this); + } + }), + + factory: function(key, options) { + return new L.Control.Geocoder.MapQuest(key, options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],8:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://search.mapzen.com/v1', + geocodingQueryParams: {}, + reverseQueryParams: {} + }, + + initialize: function(apiKey, options) { + L.Util.setOptions(this, options); + this._apiKey = apiKey; + this._lastSuggest = 0; + }, + + geocode: function(query, cb, context) { + var _this = this; + Util.getJSON(this.options.serviceUrl + "/search", L.extend({ + 'api_key': this._apiKey, + 'text': query + }, this.options.geocodingQueryParams), function(data) { + cb.call(context, _this._parseResults(data, "bbox")); + }); + }, + + suggest: function(query, cb, context) { + var _this = this; + Util.getJSON(this.options.serviceUrl + "/autocomplete", L.extend({ + 'api_key': this._apiKey, + 'text': query + }, this.options.geocodingQueryParams), L.bind(function(data) { + if (data.geocoding.timestamp > this._lastSuggest) { + this._lastSuggest = data.geocoding.timestamp; + cb.call(context, _this._parseResults(data, "bbox")); + } + }, this)); + }, + + reverse: function(location, scale, cb, context) { + var _this = this; + Util.getJSON(this.options.serviceUrl + "/reverse", L.extend({ + 'api_key': this._apiKey, + 'point.lat': location.lat, + 'point.lon': location.lng + }, this.options.reverseQueryParams), function(data) { + cb.call(context, _this._parseResults(data, "bounds")); + }); + }, + + _parseResults: function(data, bboxname) { + var results = []; + L.geoJson(data, { + pointToLayer: function (feature, latlng) { + return L.circleMarker(latlng); + }, + onEachFeature: function(feature, layer) { + var result = {}, + bbox, + center; + + if (layer.getBounds) { + bbox = layer.getBounds(); + center = bbox.getCenter(); + } else { + center = layer.getLatLng(); + bbox = L.latLngBounds(center, center); + } + + result.name = layer.feature.properties.label; + result.center = center; + result[bboxname] = bbox; + result.properties = layer.feature.properties; + results.push(result); + } + }); + return results; + } + }), + + factory: function(apiKey, options) { + return new L.Control.Geocoder.Mapzen(apiKey, options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],9:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://nominatim.openstreetmap.org/', + geocodingQueryParams: {}, + reverseQueryParams: {}, + htmlTemplate: function(r) { + var a = r.address, + parts = []; + if (a.road || a.building) { + parts.push('{building} {road} {house_number}'); + } + + if (a.city || a.town || a.village || a.hamlet) { + parts.push('{postcode} {city} {town} {village} {hamlet}'); + } + + if (a.state || a.country) { + parts.push('{state} {country}'); + } + + return Util.template(parts.join('
'), a, true); + } + }, + + initialize: function(options) { + L.Util.setOptions(this, options); + }, + + geocode: function(query, cb, context) { + Util.jsonp(this.options.serviceUrl + 'search', L.extend({ + q: query, + limit: 5, + format: 'json', + addressdetails: 1 + }, this.options.geocodingQueryParams), + function(data) { + var results = []; + for (var i = data.length - 1; i >= 0; i--) { + var bbox = data[i].boundingbox; + for (var j = 0; j < 4; j++) bbox[j] = parseFloat(bbox[j]); + results[i] = { + icon: data[i].icon, + name: data[i].display_name, + html: this.options.htmlTemplate ? + this.options.htmlTemplate(data[i]) + : undefined, + bbox: L.latLngBounds([bbox[0], bbox[2]], [bbox[1], bbox[3]]), + center: L.latLng(data[i].lat, data[i].lon), + properties: data[i] + }; + } + cb.call(context, results); + }, this, 'json_callback'); + }, + + reverse: function(location, scale, cb, context) { + Util.jsonp(this.options.serviceUrl + 'reverse', L.extend({ + lat: location.lat, + lon: location.lng, + zoom: Math.round(Math.log(scale / 256) / Math.log(2)), + addressdetails: 1, + format: 'json' + }, this.options.reverseQueryParams), function(data) { + var result = [], + loc; + + if (data && data.lat && data.lon) { + loc = L.latLng(data.lat, data.lon); + result.push({ + name: data.display_name, + html: this.options.htmlTemplate ? + this.options.htmlTemplate(data) + : undefined, + center: loc, + bounds: L.latLngBounds(loc, loc), + properties: data + }); + } + + cb.call(context, result); + }, this, 'json_callback'); + } + }), + + factory: function(options) { + return new L.Control.Geocoder.Nominatim(options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],10:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://photon.komoot.de/api/', + reverseUrl: 'https://photon.komoot.de/reverse/', + nameProperties: [ + 'name', + 'street', + 'suburb', + 'hamlet', + 'town', + 'city', + 'state', + 'country' + ] + }, + + initialize: function(options) { + L.setOptions(this, options); + }, + + geocode: function(query, cb, context) { + var params = L.extend({ + q: query + }, this.options.geocodingQueryParams); + + Util.getJSON(this.options.serviceUrl, params, L.bind(function(data) { + cb.call(context, this._decodeFeatures(data)); + }, this)); + }, + + suggest: function(query, cb, context) { + return this.geocode(query, cb, context); + }, + + reverse: function(latLng, scale, cb, context) { + var params = L.extend({ + lat: latLng.lat, + lon: latLng.lng + }, this.options.geocodingQueryParams); + + Util.getJSON(this.options.reverseUrl, params, L.bind(function(data) { + cb.call(context, this._decodeFeatures(data)); + }, this)); + }, + + _decodeFeatures: function(data) { + var results = [], + i, + f, + c, + latLng, + extent, + bbox; + + if (data && data.features) { + for (i = 0; i < data.features.length; i++) { + f = data.features[i]; + c = f.geometry.coordinates; + latLng = L.latLng(c[1], c[0]); + extent = f.properties.extent; + + if (extent) { + bbox = L.latLngBounds([extent[1], extent[0]], [extent[3], extent[2]]); + } else { + bbox = L.latLngBounds(latLng, latLng); + } + + results.push({ + name: this._deocodeFeatureName(f), + html: this.options.htmlTemplate ? + this.options.htmlTemplate(f) + : undefined, + center: latLng, + bbox: bbox, + properties: f.properties + }); + } + } + + return results; + }, + + _deocodeFeatureName: function(f) { + var j, + name; + for (j = 0; !name && j < this.options.nameProperties.length; j++) { + name = f.properties[this.options.nameProperties[j]]; + } + + return name; + } + }), + + factory: function(options) { + return new L.Control.Geocoder.Photon(options); + } +}; + + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],11:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://api.what3words.com/v2/' + }, + + initialize: function(accessToken) { + this._accessToken = accessToken; + }, + + geocode: function(query, cb, context) { + //get three words and make a dot based string + Util.getJSON(this.options.serviceUrl +'forward', { + key: this._accessToken, + addr: query.split(/\s+/).join('.') + }, function(data) { + var results = [], loc, latLng, latLngBounds; + if (data.hasOwnProperty('geometry')) { + latLng = L.latLng(data.geometry['lat'],data.geometry['lng']); + latLngBounds = L.latLngBounds(latLng, latLng); + results[0] = { + name: data.words, + bbox: latLngBounds, + center: latLng + }; + } + + cb.call(context, results); + }); + }, + + suggest: function(query, cb, context) { + return this.geocode(query, cb, context); + }, + + reverse: function(location, scale, cb, context) { + Util.getJSON(this.options.serviceUrl +'reverse', { + key: this._accessToken, + coords: [location.lat,location.lng].join(',') + }, function(data) { + var results = [],loc,latLng,latLngBounds; + if (data.status.status == 200) { + latLng = L.latLng(data.geometry['lat'],data.geometry['lng']); + latLngBounds = L.latLngBounds(latLng, latLng); + results[0] = { + name: data.words, + bbox: latLngBounds, + center: latLng + }; + } + cb.call(context, results); + }); + } + }), + + factory: function(accessToken) { + return new L.Control.Geocoder.What3Words(accessToken); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],12:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Control = _dereq_('./control'), + Nominatim = _dereq_('./geocoders/nominatim'), + Bing = _dereq_('./geocoders/bing'), + MapQuest = _dereq_('./geocoders/mapquest'), + Mapbox = _dereq_('./geocoders/mapbox'), + What3Words = _dereq_('./geocoders/what3words'), + Google = _dereq_('./geocoders/google'), + Photon = _dereq_('./geocoders/photon'), + Mapzen = _dereq_('./geocoders/mapzen'), + ArcGis = _dereq_('./geocoders/arcgis'), + HERE = _dereq_('./geocoders/here'); + +module.exports = L.Util.extend(Control["class"], { + Nominatim: Nominatim["class"], + nominatim: Nominatim.factory, + Bing: Bing["class"], + bing: Bing.factory, + MapQuest: MapQuest["class"], + mapQuest: MapQuest.factory, + Mapbox: Mapbox["class"], + mapbox: Mapbox.factory, + What3Words: What3Words["class"], + what3words: What3Words.factory, + Google: Google["class"], + google: Google.factory, + Photon: Photon["class"], + photon: Photon.factory, + Mapzen: Mapzen["class"], + mapzen: Mapzen.factory, + ArcGis: ArcGis["class"], + arcgis: ArcGis.factory, + HERE: HERE["class"], + here: HERE.factory +}); + +L.Util.extend(L.Control, { + Geocoder: module.exports, + geocoder: Control.factory +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./control":1,"./geocoders/arcgis":2,"./geocoders/bing":3,"./geocoders/google":4,"./geocoders/here":5,"./geocoders/mapbox":6,"./geocoders/mapquest":7,"./geocoders/mapzen":8,"./geocoders/nominatim":9,"./geocoders/photon":10,"./geocoders/what3words":11}],13:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + lastCallbackId = 0, + htmlEscape = (function() { + // Adapted from handlebars.js + // https://github.com/wycats/handlebars.js/ + var badChars = /[&<>"'`]/g; + var possible = /[&<>"'`]/; + var escape = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + '`': '`' + }; + + function escapeChar(chr) { + return escape[chr]; + } + + return function(string) { + if (string == null) { + return ''; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = '' + string; + + if (!possible.test(string)) { + return string; + } + return string.replace(badChars, escapeChar); + }; + })(); + +module.exports = { + jsonp: function(url, params, callback, context, jsonpParam) { + var callbackId = '_l_geocoder_' + (lastCallbackId++); + params[jsonpParam || 'callback'] = callbackId; + window[callbackId] = L.Util.bind(callback, context); + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = url + L.Util.getParamString(params); + script.id = callbackId; + document.getElementsByTagName('head')[0].appendChild(script); + }, + + getJSON: function(url, params, callback) { + var xmlHttp = new XMLHttpRequest(); + xmlHttp.onreadystatechange = function () { + if (xmlHttp.readyState !== 4){ + return; + } + if (xmlHttp.status !== 200 && xmlHttp.status !== 304){ + callback(''); + return; + } + callback(JSON.parse(xmlHttp.response)); + }; + xmlHttp.open('GET', url + L.Util.getParamString(params), true); + xmlHttp.setRequestHeader('Accept', 'application/json'); + xmlHttp.send(null); + }, + + template: function (str, data) { + return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { + var value = data[key]; + if (value === undefined) { + value = ''; + } else if (typeof value === 'function') { + value = value(data); + } + return htmlEscape(value); + }); + }, + + htmlEscape: htmlEscape +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[12])(12) +}); \ No newline at end of file diff --git a/js/leaflet-hash.js b/js/leaflet-hash.js new file mode 100644 index 0000000..70a1007 --- /dev/null +++ b/js/leaflet-hash.js @@ -0,0 +1,162 @@ +(function(window) { + var HAS_HASHCHANGE = (function() { + var doc_mode = window.documentMode; + return ('onhashchange' in window) && + (doc_mode === undefined || doc_mode > 7); + })(); + + L.Hash = function(map) { + this.onHashChange = L.Util.bind(this.onHashChange, this); + + if (map) { + this.init(map); + } + }; + + L.Hash.parseHash = function(hash) { + if(hash.indexOf('#') === 0) { + hash = hash.substr(1); + } + var args = hash.split("/"); + if (args.length == 3) { + var zoom = parseInt(args[0], 10), + lat = parseFloat(args[1]), + lon = parseFloat(args[2]); + if (isNaN(zoom) || isNaN(lat) || isNaN(lon)) { + return false; + } else { + return { + center: new L.LatLng(lat, lon), + zoom: zoom + }; + } + } else { + return false; + } + }; + + L.Hash.formatHash = function(map) { + var center = map.getCenter(), + zoom = map.getZoom(), + precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)); + + return "#" + [zoom, + center.lat.toFixed(precision), + center.lng.toFixed(precision) + ].join("/"); + }, + + L.Hash.prototype = { + map: null, + lastHash: null, + + parseHash: L.Hash.parseHash, + formatHash: L.Hash.formatHash, + + init: function(map) { + this.map = map; + + // reset the hash + this.lastHash = null; + this.onHashChange(); + + if (!this.isListening) { + this.startListening(); + } + }, + + removeFrom: function(map) { + if (this.changeTimeout) { + clearTimeout(this.changeTimeout); + } + + if (this.isListening) { + this.stopListening(); + } + + this.map = null; + }, + + onMapMove: function() { + // bail if we're moving the map (updating from a hash), + // or if the map is not yet loaded + + if (this.movingMap || !this.map._loaded) { + return false; + } + + var hash = this.formatHash(this.map); + if (this.lastHash != hash) { + location.replace(hash); + this.lastHash = hash; + } + }, + + movingMap: false, + update: function() { + var hash = location.hash; + if (hash === this.lastHash) { + return; + } + var parsed = this.parseHash(hash); + if (parsed) { + this.movingMap = true; + + this.map.setView(parsed.center, parsed.zoom); + + this.movingMap = false; + } else { + this.onMapMove(this.map); + } + }, + + // defer hash change updates every 100ms + changeDefer: 100, + changeTimeout: null, + onHashChange: function() { + // throttle calls to update() so that they only happen every + // `changeDefer` ms + if (!this.changeTimeout) { + var that = this; + this.changeTimeout = setTimeout(function() { + that.update(); + that.changeTimeout = null; + }, this.changeDefer); + } + }, + + isListening: false, + hashChangeInterval: null, + startListening: function() { + this.map.on("moveend", this.onMapMove, this); + + if (HAS_HASHCHANGE) { + L.DomEvent.addListener(window, "hashchange", this.onHashChange); + } else { + clearInterval(this.hashChangeInterval); + this.hashChangeInterval = setInterval(this.onHashChange, 50); + } + this.isListening = true; + }, + + stopListening: function() { + this.map.off("moveend", this.onMapMove, this); + + if (HAS_HASHCHANGE) { + L.DomEvent.removeListener(window, "hashchange", this.onHashChange); + } else { + clearInterval(this.hashChangeInterval); + } + this.isListening = false; + } + }; + L.hash = function(map) { + return new L.Hash(map); + }; + L.Map.prototype.addHash = function() { + this._hash = L.hash(this); + }; + L.Map.prototype.removeHash = function() { + this._hash.removeFrom(); + }; +})(window); diff --git a/js/leaflet-heat.js b/js/leaflet-heat.js new file mode 100644 index 0000000..aa8031a --- /dev/null +++ b/js/leaflet-heat.js @@ -0,0 +1,11 @@ +/* + (c) 2014, Vladimir Agafonkin + simpleheat, a tiny JavaScript library for drawing heatmaps with Canvas + https://github.com/mourner/simpleheat +*/ +!function(){"use strict";function t(i){return this instanceof t?(this._canvas=i="string"==typeof i?document.getElementById(i):i,this._ctx=i.getContext("2d"),this._width=i.width,this._height=i.height,this._max=1,void this.clear()):new t(i)}t.prototype={defaultRadius:25,defaultGradient:{.4:"blue",.6:"cyan",.7:"lime",.8:"yellow",1:"red"},data:function(t,i){return this._data=t,this},max:function(t){return this._max=t,this},add:function(t){return this._data.push(t),this},clear:function(){return this._data=[],this},radius:function(t,i){i=i||15;var a=this._circle=document.createElement("canvas"),s=a.getContext("2d"),e=this._r=t+i;return a.width=a.height=2*e,s.shadowOffsetX=s.shadowOffsetY=200,s.shadowBlur=i,s.shadowColor="black",s.beginPath(),s.arc(e-200,e-200,t,0,2*Math.PI,!0),s.closePath(),s.fill(),this},gradient:function(t){var i=document.createElement("canvas"),a=i.getContext("2d"),s=a.createLinearGradient(0,0,0,256);i.width=1,i.height=256;for(var e in t)s.addColorStop(e,t[e]);return a.fillStyle=s,a.fillRect(0,0,1,256),this._grad=a.getImageData(0,0,1,256).data,this},draw:function(t){this._circle||this.radius(this.defaultRadius),this._grad||this.gradient(this.defaultGradient);var i=this._ctx;i.clearRect(0,0,this._width,this._height);for(var a,s=0,e=this._data.length;e>s;s++)a=this._data[s],i.globalAlpha=Math.max(a[2]/this._max,t||.05),i.drawImage(this._circle,a[0]-this._r,a[1]-this._r);var n=i.getImageData(0,0,this._width,this._height);return this._colorize(n.data,this._grad),i.putImageData(n,0,0),this},_colorize:function(t,i){for(var a,s=3,e=t.length;e>s;s+=4)a=4*t[s],a&&(t[s-3]=i[a],t[s-2]=i[a+1],t[s-1]=i[a+2])}},window.simpleheat=t}(),/* + (c) 2014, Vladimir Agafonkin + Leaflet.heat, a tiny and fast heatmap plugin for Leaflet. + https://github.com/Leaflet/Leaflet.heat +*/ +L.HeatLayer=(L.Layer?L.Layer:L.Class).extend({initialize:function(t,i){this._latlngs=t,L.setOptions(this,i)},setLatLngs:function(t){return this._latlngs=t,this.redraw()},addLatLng:function(t){return this._latlngs.push(t),this.redraw()},setOptions:function(t){return L.setOptions(this,t),this._heat&&this._updateOptions(),this.redraw()},redraw:function(){return!this._heat||this._frame||this._map._animating||(this._frame=L.Util.requestAnimFrame(this._redraw,this)),this},onAdd:function(t){this._map=t,this._canvas||this._initCanvas(),t._panes.overlayPane.appendChild(this._canvas),t.on("moveend",this._reset,this),t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._canvas),t.off("moveend",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},_initCanvas:function(){var t=this._canvas=L.DomUtil.create("canvas","leaflet-heatmap-layer leaflet-layer"),i=L.DomUtil.testProp(["transformOrigin","WebkitTransformOrigin","msTransformOrigin"]);t.style[i]="50% 50%";var a=this._map.getSize();t.width=a.x,t.height=a.y;var s=this._map.options.zoomAnimation&&L.Browser.any3d;L.DomUtil.addClass(t,"leaflet-zoom-"+(s?"animated":"hide")),this._heat=simpleheat(t),this._updateOptions()},_updateOptions:function(){this._heat.radius(this.options.radius||this._heat.defaultRadius,this.options.blur),this.options.gradient&&this._heat.gradient(this.options.gradient),this.options.max&&this._heat.max(this.options.max)},_reset:function(){var t=this._map.containerPointToLayerPoint([0,0]);L.DomUtil.setPosition(this._canvas,t);var i=this._map.getSize();this._heat._width!==i.x&&(this._canvas.width=this._heat._width=i.x),this._heat._height!==i.y&&(this._canvas.height=this._heat._height=i.y),this._redraw()},_redraw:function(){var t,i,a,s,e,n,h,o,r,d=[],_=this._heat._r,l=this._map.getSize(),m=new L.Bounds(L.point([-_,-_]),l.add([_,_])),c=void 0===this.options.max?1:this.options.max,u=void 0===this.options.maxZoom?this._map.getMaxZoom():this.options.maxZoom,f=1/Math.pow(2,Math.max(0,Math.min(u-this._map.getZoom(),12))),g=_/2,p=[],v=this._map._getMapPanePos(),w=v.x%g,y=v.y%g;for(t=0,i=this._latlngs.length;i>t;t++)if(a=this._map.latLngToContainerPoint(this._latlngs[t]),m.contains(a)){e=Math.floor((a.x-w)/g)+2,n=Math.floor((a.y-y)/g)+2;var x=void 0!==this._latlngs[t].alt?this._latlngs[t].alt:void 0!==this._latlngs[t][2]?+this._latlngs[t][2]:1;r=x*f,p[n]=p[n]||[],s=p[n][e],s?(s[0]=(s[0]*s[2]+a.x*r)/(s[2]+r),s[1]=(s[1]*s[2]+a.y*r)/(s[2]+r),s[2]+=r):p[n][e]=[a.x,a.y,r]}for(t=0,i=p.length;i>t;t++)if(p[t])for(h=0,o=p[t].length;o>h;h++)s=p[t][h],s&&d.push([Math.round(s[0]),Math.round(s[1]),Math.min(s[2],c)]);this._heat.data(d).draw(this.options.minOpacity),this._frame=null},_animateZoom:function(t){var i=this._map.getZoomScale(t.zoom),a=this._map._getCenterOffset(t.center)._multiplyBy(-i).subtract(this._map._getMapPanePos());L.DomUtil.setTransform?L.DomUtil.setTransform(this._canvas,a,i):this._canvas.style[L.DomUtil.TRANSFORM]=L.DomUtil.getTranslateString(a)+" scale("+i+")"}}),L.heatLayer=function(t,i){return new L.HeatLayer(t,i)}; \ No newline at end of file diff --git a/js/leaflet-search.js b/js/leaflet-search.js new file mode 100644 index 0000000..adf504a --- /dev/null +++ b/js/leaflet-search.js @@ -0,0 +1,17 @@ +/* + * Leaflet Control Search v2.7.0 - 2016-09-13 + * + * Copyright 2016 Stefano Cudini + * stefano.cudini@gmail.com + * http://labs.easyblog.it/ + * + * Licensed under the MIT license. + * + * Demo: + * http://labs.easyblog.it/maps/leaflet-search/ + * + * Source: + * git@github.com:stefanocudini/leaflet-search.git + * + */ +!function(a){if("function"==typeof define&&define.amd)define(["leaflet"],a);else if("undefined"!=typeof module)module.exports=a(require("leaflet"));else{if("undefined"==typeof window.L)throw"Leaflet must be loaded first";a(window.L)}}(function(a){function b(a,b){var c=b.split("."),d=c.pop(),e=c.length,f=c[0],g=1;if(e>0)for(;(a=a[f])&&e>g;)f=c[g++];return a?a[d]:void 0}function c(a){return"[object Object]"===Object.prototype.toString.call(a)}return a.Control.Search=a.Control.extend({includes:a.Mixin.Events,options:{url:"",layer:null,sourceData:null,jsonpParam:null,propertyLoc:"loc",propertyName:"title",formatData:null,filterData:null,moveToLocation:null,buildTip:null,container:"",zoom:null,minLength:1,initial:!0,casesensitive:!1,autoType:!0,delayType:400,tooltipLimit:-1,tipAutoSubmit:!0,firstTipSubmit:!1,autoResize:!0,collapsed:!0,autoCollapse:!1,autoCollapseTime:1200,textErr:"Location not found",textCancel:"Cancel",textPlaceholder:"Search...",position:"topleft",hideMarkerOnCollapse:!1,marker:{icon:!1,animate:!0,circle:{radius:10,weight:3,color:"#e03",stroke:!0,fill:!1}}},initialize:function(b){a.Util.setOptions(this,b||{}),this._inputMinSize=this.options.textPlaceholder?this.options.textPlaceholder.length:10,this._layer=this.options.layer||new a.LayerGroup,this._filterData=this.options.filterData||this._defaultFilterData,this._formatData=this.options.formatData||this._defaultFormatData,this._moveToLocation=this.options.moveToLocation||this._defaultMoveToLocation,this._autoTypeTmp=this.options.autoType,this._countertips=0,this._recordsCache={},this._curReq=null},onAdd:function(b){return this._map=b,this._container=a.DomUtil.create("div","leaflet-control-search"),this._input=this._createInput(this.options.textPlaceholder,"search-input"),this._tooltip=this._createTooltip("search-tooltip"),this._cancel=this._createCancel(this.options.textCancel,"search-cancel"),this._button=this._createButton(this.options.textPlaceholder,"search-button"),this._alert=this._createAlert("search-alert"),this.options.collapsed===!1&&this.expand(this.options.collapsed),this.options.marker&&(this.options.marker instanceof a.Marker||this.options.marker instanceof a.CircleMarker?this._markerSearch=this.options.marker:c(this.options.marker)&&(this._markerSearch=new a.Control.Search.Marker([0,0],this.options.marker)),this._markerSearch._isMarkerSearch=!0),this.setLayer(this._layer),b.on({resize:this._handleAutoresize},this),this._container},addTo:function(b){return this.options.container?(this._container=this.onAdd(b),this._wrapper=a.DomUtil.get(this.options.container),this._wrapper.style.position="relative",this._wrapper.appendChild(this._container)):a.Control.prototype.addTo.call(this,b),this},onRemove:function(a){this._recordsCache={}},setLayer:function(a){return this._layer=a,this._layer.addTo(this._map),this},showAlert:function(a){a=a||this.options.textErr,this._alert.style.display="block",this._alert.innerHTML=a,clearTimeout(this.timerAlert);var b=this;return this.timerAlert=setTimeout(function(){b.hideAlert()},this.options.autoCollapseTime),this},hideAlert:function(){return this._alert.style.display="none",this},cancel:function(){return this._input.value="",this._handleKeypress({keyCode:8}),this._input.size=this._inputMinSize,this._input.focus(),this._cancel.style.display="none",this._hideTooltip(),this},expand:function(b){return b="boolean"==typeof b?b:!0,this._input.style.display="block",a.DomUtil.addClass(this._container,"search-exp"),b!==!1&&(this._input.focus(),this._map.on("dragstart click",this.collapse,this)),this.fire("search:expanded"),this},collapse:function(){return this._hideTooltip(),this.cancel(),this._alert.style.display="none",this._input.blur(),this.options.collapsed&&(this._input.style.display="none",this._cancel.style.display="none",a.DomUtil.removeClass(this._container,"search-exp"),this.options.hideMarkerOnCollapse&&this._map.removeLayer(this._markerSearch),this._map.off("dragstart click",this.collapse,this)),this.fire("search:collapsed"),this},collapseDelayed:function(){if(!this.options.autoCollapse)return this;var a=this;return clearTimeout(this.timerCollapse),this.timerCollapse=setTimeout(function(){a.collapse()},this.options.autoCollapseTime),this},collapseDelayedStop:function(){return clearTimeout(this.timerCollapse),this},_createAlert:function(b){var c=a.DomUtil.create("div",b,this._container);return c.style.display="none",a.DomEvent.on(c,"click",a.DomEvent.stop,this).on(c,"click",this.hideAlert,this),c},_createInput:function(b,c){var d=a.DomUtil.create("label",c,this._container),e=a.DomUtil.create("input",c,this._container);return e.type="text",e.size=this._inputMinSize,e.value="",e.autocomplete="off",e.autocorrect="off",e.autocapitalize="off",e.placeholder=b,e.style.display="none",e.role="search",e.id=e.role+e.type+e.size,d.htmlFor=e.id,d.style.display="none",d.value=b,a.DomEvent.disableClickPropagation(e).on(e,"keydown",this._handleKeypress,this).on(e,"blur",this.collapseDelayed,this).on(e,"focus",this.collapseDelayedStop,this),e},_createCancel:function(b,c){var d=a.DomUtil.create("a",c,this._container);return d.href="#",d.title=b,d.style.display="none",d.innerHTML="",a.DomEvent.on(d,"click",a.DomEvent.stop,this).on(d,"click",this.cancel,this),d},_createButton:function(b,c){var d=a.DomUtil.create("a",c,this._container);return d.href="#",d.title=b,a.DomEvent.on(d,"click",a.DomEvent.stop,this).on(d,"click",this._handleSubmit,this).on(d,"focus",this.collapseDelayedStop,this).on(d,"blur",this.collapseDelayed,this),d},_createTooltip:function(b){var c=a.DomUtil.create("ul",b,this._container);c.style.display="none";var d=this;return a.DomEvent.disableClickPropagation(c).on(c,"blur",this.collapseDelayed,this).on(c,"mousewheel",function(b){d.collapseDelayedStop(),a.DomEvent.stopPropagation(b)},this).on(c,"mouseover",function(a){d.collapseDelayedStop()},this),c},_createTip:function(b,c){var d;if(this.options.buildTip){if(d=this.options.buildTip.call(this,b,c),"string"==typeof d){var e=a.DomUtil.create("div");e.innerHTML=d,d=e.firstChild}}else d=a.DomUtil.create("li",""),d.innerHTML=b;return a.DomUtil.addClass(d,"search-tip"),d._text=b,this.options.tipAutoSubmit&&a.DomEvent.disableClickPropagation(d).on(d,"click",a.DomEvent.stop,this).on(d,"click",function(a){this._input.value=b,this._handleAutoresize(),this._input.focus(),this._hideTooltip(),this._handleSubmit()},this),d},_getUrl:function(a){return"function"==typeof this.options.url?this.options.url(a):this.options.url},_defaultFilterData:function(a,b){var c,d,e,f={};if(a=a.replace(/[.*+?^${}()|[\]\\]/g,""),""===a)return[];c=this.options.initial?"^":"",d=this.options.casesensitive?void 0:"i",e=new RegExp(c+a,d);for(var g in b)e.test(g)&&(f[g]=b[g]);return f},showTooltip:function(a){var b;this._countertips=0,this._tooltip.innerHTML="",this._tooltip.currentSelection=-1;for(var c in a){if(++this._countertips==this.options.tooltipLimit)break;b=this._createTip(c,a[c]),this._tooltip.appendChild(b)}return this._countertips>0?(this._tooltip.style.display="block",this._autoTypeTmp&&this._autoType(),this._autoTypeTmp=this.options.autoType):this._hideTooltip(),this._tooltip.scrollTop=0,this._countertips},_hideTooltip:function(){return this._tooltip.style.display="none",this._tooltip.innerHTML="",0},_defaultFormatData:function(c){var d,e=this.options.propertyName,f=this.options.propertyLoc,g={};if(a.Util.isArray(f))for(d in c)g[b(c[d],e)]=a.latLng(c[d][f[0]],c[d][f[1]]);else for(d in c)g[b(c[d],e)]=a.latLng(b(c[d],f));return g},_recordsFromJsonp:function(b,c){a.Control.Search.callJsonp=c;var d=a.DomUtil.create("script","leaflet-search-jsonp",document.getElementsByTagName("body")[0]),e=a.Util.template(this._getUrl(b)+"&"+this.options.jsonpParam+"=L.Control.Search.callJsonp",{s:b});return d.type="text/javascript",d.src=e,{abort:function(){d.parentNode.removeChild(d)}}},_recordsFromAjax:function(b,c){void 0===window.XMLHttpRequest&&(window.XMLHttpRequest=function(){try{return new ActiveXObject("Microsoft.XMLHTTP.6.0")}catch(a){try{return new ActiveXObject("Microsoft.XMLHTTP.3.0")}catch(b){throw new Error("XMLHttpRequest is not supported")}}});var d=a.Browser.ie&&!window.atob&&document.querySelector,e=d?new XDomainRequest:new XMLHttpRequest,f=a.Util.template(this._getUrl(b),{s:b});e.open("GET",f);return e.onload=function(){c(JSON.parse(e.responseText))},e.onreadystatechange=function(){4===e.readyState&&200===e.status&&this.onload()},e.send(),e},_recordsFromLayer:function(){var c,d={},e=this.options.propertyName;return this._layer.eachLayer(function(f){if(!f.hasOwnProperty("_isMarkerSearch"))if(f instanceof a.Marker||f instanceof a.CircleMarker)try{if(b(f.options,e))c=f.getLatLng(),c.layer=f,d[b(f.options,e)]=c;else{if(!b(f.feature.properties,e))throw new Error("propertyName '"+e+"' not found in marker");c=f.getLatLng(),c.layer=f,d[b(f.feature.properties,e)]=c}}catch(g){console}else if(f.hasOwnProperty("feature"))try{if(!f.feature.properties.hasOwnProperty(e))throw new Error("propertyName '"+e+"' not found in feature");c=f.getBounds().getCenter(),c.layer=f,d[f.feature.properties[e]]=c}catch(g){console}else f instanceof a.LayerGroup&&f.eachLayer(function(a){c=a.getLatLng(),c.layer=a,d[a.feature.properties[e]]=c})},this),d},_autoType:function(){var a=this._input.value.length,b=this._tooltip.firstChild._text,c=b.length;if(0===b.indexOf(this._input.value))if(this._input.value=b,this._handleAutoresize(),this._input.createTextRange){var d=this._input.createTextRange();d.collapse(!0),d.moveStart("character",a),d.moveEnd("character",c),d.select()}else this._input.setSelectionRange?this._input.setSelectionRange(a,c):this._input.selectionStart&&(this._input.selectionStart=a,this._input.selectionEnd=c)},_hideAutoType:function(){var a;if((a=this._input.selection)&&a.empty)a.empty();else if(this._input.createTextRange){a=this._input.createTextRange(),a.collapse(!0);var b=this._input.value.length;a.moveStart("character",b),a.moveEnd("character",b),a.select()}else this._input.getSelection&&this._input.getSelection().removeAllRanges(),this._input.selectionStart=this._input.selectionEnd},_handleKeypress:function(a){switch(a.keyCode){case 27:this.collapse();break;case 13:(1==this._countertips||this.options.firstTipSubmit&&this._countertips>0)&&this._handleArrowSelect(1),this._handleSubmit();break;case 38:this._handleArrowSelect(-1);break;case 40:this._handleArrowSelect(1);break;case 8:case 45:case 46:this._autoTypeTmp=!1;break;case 37:case 39:case 16:case 17:case 35:case 36:break;default:if(this._input.value.length?this._cancel.style.display="block":this._cancel.style.display="none",this._input.value.length>=this.options.minLength){var b=this;clearTimeout(this.timerKeypress),this.timerKeypress=setTimeout(function(){b._fillRecordsCache()},this.options.delayType)}else this._hideTooltip()}this._handleAutoresize()},searchText:function(b){var c=b.charCodeAt(b.length);this._input.value=b,this._input.style.display="block",a.DomUtil.addClass(this._container,"search-exp"),this._autoTypeTmp=!1,this._handleKeypress({keyCode:c})},_fillRecordsCache:function(){var b,c=this._input.value,d=this;this._curReq&&this._curReq.abort&&this._curReq.abort(),a.DomUtil.addClass(this._container,"search-load"),this.options.layer?(this._recordsCache=this._recordsFromLayer(),b=this._filterData(this._input.value,this._recordsCache),this.showTooltip(b),a.DomUtil.removeClass(this._container,"search-load")):(this.options.sourceData?this._retrieveData=this.options.sourceData:this.options.url&&(this._retrieveData=this.options.jsonpParam?this._recordsFromJsonp:this._recordsFromAjax),this._curReq=this._retrieveData.call(this,c,function(c){d._recordsCache=d._formatData(c),b=d.options.sourceData?d._filterData(d._input.value,d._recordsCache):d._recordsCache,d.showTooltip(b),a.DomUtil.removeClass(d._container,"search-load")}))},_handleAutoresize:function(){this._input.style.maxWidth!=this._map._container.offsetWidth&&(this._input.style.maxWidth=a.DomUtil.getStyle(this._map._container,"width")),this.options.autoResize&&this._container.offsetWidth+45=c.length-1)a.DomUtil.addClass(c[this._tooltip.currentSelection],"search-tip-select");else if(-1==b&&this._tooltip.currentSelection<=0)this._tooltip.currentSelection=-1;else if("none"!=this._tooltip.style.display){this._tooltip.currentSelection+=b,a.DomUtil.addClass(c[this._tooltip.currentSelection],"search-tip-select"),this._input.value=c[this._tooltip.currentSelection]._text;var d=c[this._tooltip.currentSelection].offsetTop;d+c[this._tooltip.currentSelection].clientHeight>=this._tooltip.scrollTop+this._tooltip.clientHeight?this._tooltip.scrollTop=d-this._tooltip.clientHeight+c[this._tooltip.currentSelection].clientHeight:d<=this._tooltip.scrollTop&&(this._tooltip.scrollTop=d)}},_handleSubmit:function(){if(this._hideAutoType(),this.hideAlert(),this._hideTooltip(),"none"==this._input.style.display)this.expand();else if(""===this._input.value)this.collapse();else{var a=this._getLocation(this._input.value);a===!1?this.showAlert():(this.showLocation(a,this._input.value),this.fire("search:locationfound",{latlng:a,text:this._input.value,layer:a.layer?a.layer:null}))}},_getLocation:function(a){return this._recordsCache.hasOwnProperty(a)?this._recordsCache[a]:!1},_defaultMoveToLocation:function(a,b,c){this.options.zoom?this._map.setView(a,this.options.zoom):this._map.panTo(a)},showLocation:function(a,b){var c=this;return c._map.once("moveend zoomend",function(b){c._markerSearch&&c._markerSearch.addTo(c._map).setLatLng(a)}),c._moveToLocation(a,b,c._map),c.options.autoCollapse&&c.collapse(),c}}),a.Control.Search.Marker=a.Marker.extend({includes:a.Mixin.Events,options:{icon:new a.Icon.Default,animate:!0,circle:{radius:10,weight:3,color:"#e03",stroke:!0,fill:!1}},initialize:function(b,d){a.setOptions(this,d),d.icon===!0&&(d.icon=new a.Icon.Default),a.Marker.prototype.initialize.call(this,b,d),c(this.options.circle)&&(this._circleLoc=new a.CircleMarker(b,this.options.circle))},onAdd:function(b){a.Marker.prototype.onAdd.call(this,b),this._circleLoc&&(b.addLayer(this._circleLoc),this.options.animate&&this.animate())},onRemove:function(b){a.Marker.prototype.onRemove.call(this,b),this._circleLoc&&b.removeLayer(this._circleLoc)},setLatLng:function(b){return a.Marker.prototype.setLatLng.call(this,b),this._circleLoc&&this._circleLoc.setLatLng(b),this},_initIcon:function(){this.options.icon&&a.Marker.prototype._initIcon.call(this)},_removeIcon:function(){this.options.icon&&a.Marker.prototype._removeIcon.call(this)},animate:function(){if(this._circleLoc){var a=this._circleLoc,b=200,c=5,d=parseInt(a._radius/c),e=this.options.circle.radius,f=2*a._radius,g=0;a._timerAnimLoc=setInterval(function(){g+=.5,d+=g,f-=d,a.setRadius(f),e>f&&(clearInterval(a._timerAnimLoc),a.setRadius(e))},b)}return this}}),a.Map.addInitHook(function(){this.options.searchControl&&(this.searchControl=a.control.search(this.options.searchControl),this.addControl(this.searchControl))}),a.control.search=function(b){return new a.Control.Search(b)},a.Control.Search}); \ No newline at end of file diff --git a/js/leaflet-svg-shape-markers.min.js b/js/leaflet-svg-shape-markers.min.js new file mode 100644 index 0000000..7a5e693 --- /dev/null +++ b/js/leaflet-svg-shape-markers.min.js @@ -0,0 +1 @@ +L.SVG.include({_updateShape:function(t){var i=t._point,s=t._radius,e=t.options.shape;if("diamond"===e){var n="M"+(i.x-s)+" "+i.y+" L "+i.x+" "+(i.y-s)+" L"+(i.x+s)+" "+i.y+" L"+i.x+" "+(i.y+s)+" L"+(i.x-s)+" "+i.y;this._setPath(t,n)}if("square"===e){var n="M"+(i.x-s)+" "+(i.y-s)+" L "+(i.x+s)+" "+(i.y-s)+" L"+(i.x+s)+" "+(i.y+s)+" L"+(i.x-s)+" "+(i.y+s)+" L"+(i.x-s)+" "+(i.y-s);this._setPath(t,n)}if("triangle"===e||"triangle-up"===e){var n="M"+(i.x-s)+" "+(i.y+s)+" L"+i.x+" "+(i.y-s)+" L"+(i.x+s)+" "+(i.y+s)+" Z";this._setPath(t,n)}if("triangle-down"===e){var n="M"+(i.x-s)+" "+(i.y-s)+" L"+i.x+" "+(i.y+s)+" L"+(i.x+s)+" "+(i.y-s)+" Z";this._setPath(t,n)}if("circle"===e&&this._updateCircle(t),"x"===e){s/=2;var n="M"+(i.x+s)+","+(i.y+s)+"L"+(i.x-s)+","+(i.y-s)+"M"+(i.x-s)+","+(i.y+s)+"L"+(i.x+s)+","+(i.y-s);this._setPath(t,n)}}}),L.ShapeMarker=L.Path.extend({options:{fill:!0,shape:"triangle",radius:10},initialize:function(t,i){L.setOptions(this,i),this._latlng=L.latLng(t),this._radius=this.options.radius},setLatLng:function(t){return this._latlng=L.latLng(t),this.redraw(),this.fire("move",{latlng:this._latlng})},getLatLng:function(){return this._latlng},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius},setStyle:function(t){var i=t&&t.radius||this._radius;return L.Path.prototype.setStyle.call(this,t),this.setRadius(i),this},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng),this._updateBounds()},_updateBounds:function(){var t=this._radius,i=this._radiusY||t,s=this._clickTolerance(),e=[t+s,i+s];this._pxBounds=new L.Bounds(this._point.subtract(e),this._point.add(e))},_update:function(){this._map&&this._updatePath()},_updatePath:function(){this._renderer._updateShape(this)},_empty:function(){return this._size&&!this._renderer._bounds.intersects(this._pxBounds)},toGeoJSON:function(){return L.GeoJSON.getFeature(this,{type:"Point",coordinates:L.GeoJSON.latLngToCoords(this.getLatLng())})}}),L.shapeMarker=function(t,i){return new L.ShapeMarker(t,i)}; \ No newline at end of file diff --git a/js/leaflet-tilelayer-wmts.js b/js/leaflet-tilelayer-wmts.js new file mode 100644 index 0000000..64433fd --- /dev/null +++ b/js/leaflet-tilelayer-wmts.js @@ -0,0 +1 @@ +L.TileLayer.WMTS=L.TileLayer.extend({defaultWmtsParams:{service:"WMTS",request:"GetTile",version:"1.0.0",layer:"",style:"",tilematrixSet:"",format:"image/jpeg"},initialize:function(e,t){this._url=e;var n=L.extend({},this.defaultWmtsParams),r=t.tileSize||this.options.tileSize;if(t.detectRetina&&L.Browser.retina){n.width=n.height=r*2}else{n.width=n.height=r}for(var i in t){if(!this.options.hasOwnProperty(i)&&i!="matrixIds"){n[i]=t[i]}}this.wmtsParams=n;this.matrixIds=t.matrixIds||this.getDefaultMatrix();L.setOptions(this,t)},onAdd:function(e){L.TileLayer.prototype.onAdd.call(this,e)},getTileUrl:function(e,t){var n=this._map;crs=n.options.crs;tileSize=this.options.tileSize;nwPoint=e.multiplyBy(tileSize);nwPoint.x+=1;nwPoint.y-=1;sePoint=nwPoint.add(new L.Point(tileSize,tileSize));nw=crs.project(n.unproject(nwPoint,t));se=crs.project(n.unproject(sePoint,t));tilewidth=se.x-nw.x;t=n.getZoom();ident=this.matrixIds[t].identifier;X0=this.matrixIds[t].topLeftCorner.lng;Y0=this.matrixIds[t].topLeftCorner.lat;tilecol=Math.floor((nw.x-X0)/tilewidth);tilerow=-Math.floor((nw.y-Y0)/tilewidth);url=L.Util.template(this._url,{s:this._getSubdomain(e)});return url+L.Util.getParamString(this.wmtsParams,url)+"&tilematrix="+ident+"&tilerow="+tilerow+"&tilecol="+tilecol},setParams:function(e,t){L.extend(this.wmtsParams,e);if(!t){this.redraw()}return this},getDefaultMatrix:function(){var e=new Array(22);for(var t=0;t<22;t++){e[t]={identifier:""+t,topLeftCorner:new L.LatLng(20037508.3428,-20037508.3428)}}return e}});L.tileLayer.wmts=function(e,t){return new L.TileLayer.WMTS(e,t)} diff --git a/js/leaflet.js b/js/leaflet.js new file mode 100644 index 0000000..bc9ef0f --- /dev/null +++ b/js/leaflet.js @@ -0,0 +1,5 @@ +/* @preserve + * Leaflet 1.6.0+Detached: 0c81bdf904d864fd12a286e3d1979f47aba17991.0c81bdf, a JS library for interactive maps. http://leafletjs.com + * (c) 2010-2019 Vladimir Agafonkin, (c) 2010-2011 CloudMade + */ +!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i(t.L={})}(this,function(t){"use strict";var i=Object.freeze;function h(t){var i,e,n,o;for(e=1,n=arguments.length;e=this.min.x&&e.x<=this.max.x&&i.y>=this.min.y&&e.y<=this.max.y},intersects:function(t){t=R(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>=i.x&&n.x<=e.x,r=o.y>=i.y&&n.y<=e.y;return s&&r},overlaps:function(t){t=R(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>i.x&&n.xi.y&&n.y=n.lat&&e.lat<=o.lat&&i.lng>=n.lng&&e.lng<=o.lng},intersects:function(t){t=D(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>=i.lat&&n.lat<=e.lat,r=o.lng>=i.lng&&n.lng<=e.lng;return s&&r},overlaps:function(t){t=D(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>i.lat&&n.lati.lng&&n.lng';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(t){return!1}}();function Bt(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var At=(Object.freeze||Object)({ie:it,ielt9:et,edge:nt,webkit:ot,android:st,android23:rt,androidStock:ht,opera:ut,chrome:lt,gecko:ct,safari:_t,phantom:dt,opera12:pt,win:mt,ie3d:ft,webkit3d:gt,gecko3d:vt,any3d:yt,mobile:xt,mobileWebkit:wt,mobileWebkit3d:Pt,msPointer:Lt,pointer:bt,touch:Tt,mobileOpera:zt,mobileGecko:Mt,retina:Ct,passiveEvents:Et,canvas:St,svg:Zt,vml:kt}),It=Lt?"MSPointerDown":"pointerdown",Ot=Lt?"MSPointerMove":"pointermove",Rt=Lt?"MSPointerUp":"pointerup",Nt=Lt?"MSPointerCancel":"pointercancel",Dt=["INPUT","SELECT","OPTION"],jt={},Wt=!1,Ht=0;function Ft(t,i,e,n){return"touchstart"===i?function(t,i,e){var n=a(function(t){if("mouse"!==t.pointerType&&t.MSPOINTER_TYPE_MOUSE&&t.pointerType!==t.MSPOINTER_TYPE_MOUSE){if(!(Dt.indexOf(t.target.tagName)<0))return;ji(t)}Gt(t,i)});t["_leaflet_touchstart"+e]=n,t.addEventListener(It,n,!1),Wt||(document.documentElement.addEventListener(It,Ut,!0),document.documentElement.addEventListener(Ot,Vt,!0),document.documentElement.addEventListener(Rt,qt,!0),document.documentElement.addEventListener(Nt,qt,!0),Wt=!0)}(t,e,n):"touchmove"===i?function(t,i,e){function n(t){(t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&"mouse"!==t.pointerType||0!==t.buttons)&&Gt(t,i)}t["_leaflet_touchmove"+e]=n,t.addEventListener(Ot,n,!1)}(t,e,n):"touchend"===i&&function(t,i,e){function n(t){Gt(t,i)}t["_leaflet_touchend"+e]=n,t.addEventListener(Rt,n,!1),t.addEventListener(Nt,n,!1)}(t,e,n),this}function Ut(t){jt[t.pointerId]=t,Ht++}function Vt(t){jt[t.pointerId]&&(jt[t.pointerId]=t)}function qt(t){delete jt[t.pointerId],Ht--}function Gt(t,i){for(var e in t.touches=[],jt)t.touches.push(jt[e]);t.changedTouches=[t],i(t)}var Kt=Lt?"MSPointerDown":bt?"pointerdown":"touchstart",Yt=Lt?"MSPointerUp":bt?"pointerup":"touchend",Xt="_leaflet_";function Jt(t,o,i){var s,r,a=!1;function e(t){var i;if(bt){if(!nt||"mouse"===t.pointerType)return;i=Ht}else i=t.touches.length;if(!(1this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,i){this._enforcingBounds=!0;var e=this.getCenter(),n=this._limitCenter(e,this._zoom,D(t));return e.equals(n)||this.panTo(n,i),this._enforcingBounds=!1,this},panInside:function(t,i){var e=I((i=i||{}).paddingTopLeft||i.padding||[0,0]),n=I(i.paddingBottomRight||i.padding||[0,0]),o=this.getCenter(),s=this.project(o),r=this.project(t),a=this.getPixelBounds(),h=a.getSize().divideBy(2),u=R([a.min.add(e),a.max.subtract(n)]);if(!u.contains(r)){this._enforcingBounds=!0;var l=s.subtract(r),c=I(r.x+l.x,r.y+l.y);(r.xu.max.x)&&(c.x=s.x-l.x,0u.max.y)&&(c.y=s.y-l.y,0=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,i){for(var e,n=[],o="mouseout"===i||"mouseover"===i,s=t.target||t.srcElement,r=!1;s;){if((e=this._targets[u(s)])&&("click"===i||"preclick"===i)&&!t._simulated&&this._draggableMoved(e)){r=!0;break}if(e&&e.listens(i,!0)){if(o&&!Yi(s,t))break;if(n.push(e),o)break}if(s===this._container)break;s=s.parentNode}return n.length||r||o||!Yi(s,t)||(n=[this]),n},_handleDOMEvent:function(t){if(this._loaded&&!Ki(t)){var i=t.type;"mousedown"!==i&&"keypress"!==i&&"keyup"!==i&&"keydown"!==i||Mi(t.target||t.srcElement),this._fireDOMEvent(t,i)}},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,i,e){if("click"===t.type){var n=h({},t);n.type="preclick",this._fireDOMEvent(n,n.type,e)}if(!t._stopped&&(e=(e||[]).concat(this._findEventTargets(t,i))).length){var o=e[0];"contextmenu"===i&&o.listens(i,!0)&&ji(t);var s={originalEvent:t};if("keypress"!==t.type&&"keydown"!==t.type&&"keyup"!==t.type){var r=o.getLatLng&&(!o._radius||o._radius<=10);s.containerPoint=r?this.latLngToContainerPoint(o.getLatLng()):this.mouseEventToContainerPoint(t),s.layerPoint=this.containerPointToLayerPoint(s.containerPoint),s.latlng=r?o.getLatLng():this.layerPointToLatLng(s.layerPoint)}for(var a=0;athis.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(i),o=this._getCenterOffset(t)._divideBy(1-1/n);return!(!0!==e.animate&&!this.getSize().contains(o))&&(M(function(){this._moveStart(!0,!1)._animateZoom(t,i,!0)},this),!0)},_animateZoom:function(t,i,e,n){this._mapPane&&(e&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=i,mi(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:i,noUpdate:n}),setTimeout(a(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&fi(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),M(function(){this._moveEnd(!0)},this))}});function Qi(t){return new te(t)}var te=S.extend({options:{position:"topright"},initialize:function(t){p(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var i=this._map;return i&&i.removeControl(this),this.options.position=t,i&&i.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var i=this._container=this.onAdd(t),e=this.getPosition(),n=t._controlCorners[e];return mi(i,"leaflet-control"),-1!==e.indexOf("bottom")?n.insertBefore(i,n.firstChild):n.appendChild(i),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(li(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0",n=document.createElement("div");return n.innerHTML=e,n.firstChild},_addItem:function(t){var i,e=document.createElement("label"),n=this._map.hasLayer(t.layer);t.overlay?((i=document.createElement("input")).type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=n):i=this._createRadioElement("leaflet-base-layers_"+u(this),n),this._layerControlInputs.push(i),i.layerId=u(t.layer),ki(i,"click",this._onInputClick,this);var o=document.createElement("span");o.innerHTML=" "+t.name;var s=document.createElement("div");return e.appendChild(s),s.appendChild(i),s.appendChild(o),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(e),this._checkDisabledLayers(),e},_onInputClick:function(){var t,i,e=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=e.length-1;0<=s;s--)t=e[s],i=this._getLayer(t.layerId).layer,t.checked?n.push(i):t.checked||o.push(i);for(s=0;si.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),ee=te.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"−",zoomOutTitle:"Zoom out"},onAdd:function(t){var i="leaflet-control-zoom",e=ui("div",i+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,i+"-in",e,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,i+"-out",e,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),e},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,i,e,n,o){var s=ui("a",e,n);return s.innerHTML=t,s.href="#",s.title=i,s.setAttribute("role","button"),s.setAttribute("aria-label",i),Di(s),ki(s,"click",Wi),ki(s,"click",o,this),ki(s,"click",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,i="leaflet-disabled";fi(this._zoomInButton,i),fi(this._zoomOutButton,i),!this._disabled&&t._zoom!==t.getMinZoom()||mi(this._zoomOutButton,i),!this._disabled&&t._zoom!==t.getMaxZoom()||mi(this._zoomInButton,i)}});$i.mergeOptions({zoomControl:!0}),$i.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new ee,this.addControl(this.zoomControl))});var ne=te.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var i="leaflet-control-scale",e=ui("div",i),n=this.options;return this._addScales(n,i+"-line",e),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),e},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,i,e){t.metric&&(this._mScale=ui("div",i,e)),t.imperial&&(this._iScale=ui("div",i,e))},_update:function(){var t=this._map,i=t.getSize().y/2,e=t.distance(t.containerPointToLatLng([0,i]),t.containerPointToLatLng([this.options.maxWidth,i]));this._updateScales(e)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var i=this._getRoundNum(t),e=i<1e3?i+" m":i/1e3+" km";this._updateScale(this._mScale,e,i/t)},_updateImperial:function(t){var i,e,n,o=3.2808399*t;5280Leaflet'},initialize:function(t){p(this,t),this._attributions={}},onAdd:function(t){for(var i in(t.attributionControl=this)._container=ui("div","leaflet-control-attribution"),Di(this._container),t._layers)t._layers[i].getAttribution&&this.addAttribution(t._layers[i].getAttribution());return this._update(),this._container},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t&&(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update()),this},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t=[];for(var i in this._attributions)this._attributions[i]&&t.push(i);var e=[];this.options.prefix&&e.push(this.options.prefix),t.length&&e.push(t.join(", ")),this._container.innerHTML=e.join(" | ")}}});$i.mergeOptions({attributionControl:!0}),$i.addInitHook(function(){this.options.attributionControl&&(new oe).addTo(this)});te.Layers=ie,te.Zoom=ee,te.Scale=ne,te.Attribution=oe,Qi.layers=function(t,i,e){return new ie(t,i,e)},Qi.zoom=function(t){return new ee(t)},Qi.scale=function(t){return new ne(t)},Qi.attribution=function(t){return new oe(t)};var se=S.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}});se.addTo=function(t,i){return t.addHandler(i,this),this};var re,ae={Events:Z},he=Tt?"touchstart mousedown":"mousedown",ue={mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},le={mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"},ce=k.extend({options:{clickTolerance:3},initialize:function(t,i,e,n){p(this,n),this._element=t,this._dragStartTarget=i||t,this._preventOutline=e},enable:function(){this._enabled||(ki(this._dragStartTarget,he,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(ce._dragging===this&&this.finishDrag(),Ai(this._dragStartTarget,he,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){if(!t._simulated&&this._enabled&&(this._moved=!1,!pi(this._element,"leaflet-zoom-anim")&&!(ce._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((ce._dragging=this)._preventOutline&&Mi(this._element),Ti(),Qt(),this._moving)))){this.fire("down");var i=t.touches?t.touches[0]:t,e=Ei(this._element);this._startPoint=new B(i.clientX,i.clientY),this._parentScale=Si(e),ki(document,le[t.type],this._onMove,this),ki(document,ue[t.type],this._onUp,this)}},_onMove:function(t){if(!t._simulated&&this._enabled)if(t.touches&&1i.max.x&&(e|=2),t.yi.max.y&&(e|=8),e}function ge(t,i,e,n){var o,s=i.x,r=i.y,a=e.x-s,h=e.y-r,u=a*a+h*h;return 0this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()t.y!=n.y>t.y&&t.x<(n.x-e.x)*(t.y-e.y)/(n.y-e.y)+e.x&&(u=!u);return u||je.prototype._containsPoint.call(this,t,!0)}});var He=ke.extend({initialize:function(t,i){p(this,i),this._layers={},t&&this.addData(t)},addData:function(t){var i,e,n,o=v(t)?t:t.features;if(o){for(i=0,e=o.length;iu.x&&(l=s.x+n-u.x+h.x),s.x-l-a.x<0&&(l=s.x-a.x),s.y+e+h.y>u.y&&(c=s.y+e-u.y+h.y),s.y-c-a.y<0&&(c=s.y-a.y),(l||c)&&t.fire("autopanstart").panBy([l,c])}},_onCloseButtonClick:function(t){this._close(),Wi(t)},_getAnchor:function(){return I(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});$i.mergeOptions({closePopupOnClick:!0}),$i.include({openPopup:function(t,i,e){return t instanceof sn||(t=new sn(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),Se.include({bindPopup:function(t,i){return t instanceof sn?(p(t,i),(this._popup=t)._source=this):(this._popup&&!i||(this._popup=new sn(i,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t,i){return this._popup&&this._map&&(i=this._popup._prepareOpen(this,t,i),this._map.openPopup(this._popup,i)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var i=t.layer||t.target;this._popup&&this._map&&(Wi(t),i instanceof Re?this.openPopup(t.layer||t.target,t.latlng):this._map.hasLayer(this._popup)&&this._popup._source===i?this.closePopup():this.openPopup(i,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var rn=on.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){on.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&this._source.fire("tooltipopen",{tooltip:this},!0)},onRemove:function(t){on.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&this._source.fire("tooltipclose",{tooltip:this},!0)},getEvents:function(){var t=on.prototype.getEvents.call(this);return Tt&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=ui("div",t)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var i=this._map,e=this._container,n=i.latLngToContainerPoint(i.getCenter()),o=i.layerPointToContainerPoint(t),s=this.options.direction,r=e.offsetWidth,a=e.offsetHeight,h=I(this.options.offset),u=this._getAnchor();t="top"===s?t.add(I(-r/2+h.x,-a+h.y+u.y,!0)):"bottom"===s?t.subtract(I(r/2-h.x,-h.y,!0)):"center"===s?t.subtract(I(r/2+h.x,a/2-u.y+h.y,!0)):"right"===s||"auto"===s&&o.xthis.options.maxZoom||ethis.options.maxZoom||void 0!==this.options.minZoom&&oe.max.x)||!i.wrapLat&&(t.ye.max.y))return!1}if(!this.options.bounds)return!0;var n=this._tileCoordsToBounds(t);return D(this.options.bounds).overlaps(n)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var i=this._map,e=this.getTileSize(),n=t.scaleBy(e),o=n.add(e);return[i.unproject(n,t.z),i.unproject(o,t.z)]},_tileCoordsToBounds:function(t){var i=this._tileCoordsToNwSe(t),e=new N(i[0],i[1]);return this.options.noWrap||(e=this._map.wrapLatLngBounds(e)),e},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var i=t.split(":"),e=new B(+i[0],+i[1]);return e.z=+i[2],e},_removeTile:function(t){var i=this._tiles[t];i&&(li(i.el),delete this._tiles[t],this.fire("tileunload",{tile:i.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){mi(t,"leaflet-tile");var i=this.getTileSize();t.style.width=i.x+"px",t.style.height=i.y+"px",t.onselectstart=l,t.onmousemove=l,et&&this.options.opacity<1&&yi(t,this.options.opacity),st&&!rt&&(t.style.WebkitBackfaceVisibility="hidden")},_addTile:function(t,i){var e=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),a(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&M(a(this._tileReady,this,t,null,o)),Pi(o,e),this._tiles[n]={el:o,coords:t,current:!0},i.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,i,e){i&&this.fire("tileerror",{error:i,tile:e,coords:t});var n=this._tileCoordsToKey(t);(e=this._tiles[n])&&(e.loaded=+new Date,this._map._fadeAnimated?(yi(e.el,0),C(this._fadeFrame),this._fadeFrame=M(this._updateOpacity,this)):(e.active=!0,this._pruneTiles()),i||(mi(e.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:e.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),et||!this._map._fadeAnimated?M(this._pruneTiles,this):setTimeout(a(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var i=new B(this._wrapX?r(t.x,this._wrapX):t.x,this._wrapY?r(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToTileRange:function(t){var i=this.getTileSize();return new O(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var un=hn.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,i){this._url=t,(i=p(this,i)).detectRetina&&Ct&&0')}}catch(t){return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),fn={_initContainer:function(){this._container=ui("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(_n.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var i=t._container=mn("shape");mi(i,"leaflet-vml-shape "+(this.options.className||"")),i.coordsize="1 1",t._path=mn("path"),i.appendChild(t._path),this._updateStyle(t),this._layers[u(t)]=t},_addPath:function(t){var i=t._container;this._container.appendChild(i),t.options.interactive&&t.addInteractiveTarget(i)},_removePath:function(t){var i=t._container;li(i),t.removeInteractiveTarget(i),delete this._layers[u(t)]},_updateStyle:function(t){var i=t._stroke,e=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(i||(i=t._stroke=mn("stroke")),o.appendChild(i),i.weight=n.weight+"px",i.color=n.color,i.opacity=n.opacity,n.dashArray?i.dashStyle=v(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):i.dashStyle="",i.endcap=n.lineCap.replace("butt","flat"),i.joinstyle=n.lineJoin):i&&(o.removeChild(i),t._stroke=null),n.fill?(e||(e=t._fill=mn("fill")),o.appendChild(e),e.color=n.fillColor||n.color,e.opacity=n.fillOpacity):e&&(o.removeChild(e),t._fill=null)},_updateCircle:function(t){var i=t._point.round(),e=Math.round(t._radius),n=Math.round(t._radiusY||e);this._setPath(t,t._empty()?"M0 0":"AL "+i.x+","+i.y+" "+e+","+n+" 0,23592600")},_setPath:function(t,i){t._path.v=i},_bringToFront:function(t){_i(t._container)},_bringToBack:function(t){di(t._container)}},gn=kt?mn:$,vn=_n.extend({getEvents:function(){var t=_n.prototype.getEvents.call(this);return t.zoomstart=this._onZoomStart,t},_initContainer:function(){this._container=gn("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=gn("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){li(this._container),Ai(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_onZoomStart:function(){this._update()},_update:function(){if(!this._map._animatingZoom||!this._bounds){_n.prototype._update.call(this);var t=this._bounds,i=t.getSize(),e=this._container;this._svgSize&&this._svgSize.equals(i)||(this._svgSize=i,e.setAttribute("width",i.x),e.setAttribute("height",i.y)),Pi(e,t.min),e.setAttribute("viewBox",[t.min.x,t.min.y,i.x,i.y].join(" ")),this.fire("update")}},_initPath:function(t){var i=t._path=gn("path");t.options.className&&mi(i,t.options.className),t.options.interactive&&mi(i,"leaflet-interactive"),this._updateStyle(t),this._layers[u(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){li(t._path),t.removeInteractiveTarget(t._path),delete this._layers[u(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var i=t._path,e=t.options;i&&(e.stroke?(i.setAttribute("stroke",e.color),i.setAttribute("stroke-opacity",e.opacity),i.setAttribute("stroke-width",e.weight),i.setAttribute("stroke-linecap",e.lineCap),i.setAttribute("stroke-linejoin",e.lineJoin),e.dashArray?i.setAttribute("stroke-dasharray",e.dashArray):i.removeAttribute("stroke-dasharray"),e.dashOffset?i.setAttribute("stroke-dashoffset",e.dashOffset):i.removeAttribute("stroke-dashoffset")):i.setAttribute("stroke","none"),e.fill?(i.setAttribute("fill",e.fillColor||e.color),i.setAttribute("fill-opacity",e.fillOpacity),i.setAttribute("fill-rule",e.fillRule||"evenodd")):i.setAttribute("fill","none"))},_updatePoly:function(t,i){this._setPath(t,Q(t._parts,i))},_updateCircle:function(t){var i=t._point,e=Math.max(Math.round(t._radius),1),n="a"+e+","+(Math.max(Math.round(t._radiusY),1)||e)+" 0 1,0 ",o=t._empty()?"M0 0":"M"+(i.x-e)+","+i.y+n+2*e+",0 "+n+2*-e+",0 ";this._setPath(t,o)},_setPath:function(t,i){t._path.setAttribute("d",i)},_bringToFront:function(t){_i(t._path)},_bringToBack:function(t){di(t._path)}});function yn(t){return Zt||kt?new vn(t):null}kt&&vn.include(fn),$i.include({getRenderer:function(t){var i=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer;return i||(i=this._renderer=this._createRenderer()),this.hasLayer(i)||this.addLayer(i),i},_getPaneRenderer:function(t){if("overlayPane"===t||void 0===t)return!1;var i=this._paneRenderers[t];return void 0===i&&(i=this._createRenderer({pane:t}),this._paneRenderers[t]=i),i},_createRenderer:function(t){return this.options.preferCanvas&&pn(t)||yn(t)}});var xn=We.extend({initialize:function(t,i){We.prototype.initialize.call(this,this._boundsToLatLngs(t),i)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=D(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});vn.create=gn,vn.pointsToPath=Q,He.geometryToLayer=Fe,He.coordsToLatLng=Ve,He.coordsToLatLngs=qe,He.latLngToCoords=Ge,He.latLngsToCoords=Ke,He.getFeature=Ye,He.asFeature=Xe,$i.mergeOptions({boxZoom:!0});var wn=se.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){ki(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Ai(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){li(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),Qt(),Ti(),this._startPoint=this._map.mouseEventToContainerPoint(t),ki(document,{contextmenu:Wi,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=ui("div","leaflet-zoom-box",this._container),mi(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var i=new O(this._point,this._startPoint),e=i.getSize();Pi(this._box,i.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(li(this._box),fi(this._container,"leaflet-crosshair")),ti(),zi(),Ai(document,{contextmenu:Wi,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(a(this._resetState,this),0);var i=new N(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(i).fire("boxzoomend",{boxZoomBounds:i})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}});$i.addInitHook("addHandler","boxZoom",wn),$i.mergeOptions({doubleClickZoom:!0});var Pn=se.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var i=this._map,e=i.getZoom(),n=i.options.zoomDelta,o=t.originalEvent.shiftKey?e-n:e+n;"center"===i.options.doubleClickZoom?i.setZoom(o):i.setZoomAround(t.containerPoint,o)}});$i.addInitHook("addHandler","doubleClickZoom",Pn),$i.mergeOptions({dragging:!0,inertia:!rt,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var Ln=se.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new ce(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))}mi(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){fi(this._map._container,"leaflet-grab"),fi(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t=this._map;if(t._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var i=D(this._map.options.maxBounds);this._offsetLimit=R(this._map.latLngToContainerPoint(i.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(i.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else this._offsetLimit=null;t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){if(this._map.options.inertia){var i=this._lastTime=+new Date,e=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(e),this._times.push(i),this._prunePositions(i)}this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1i.max.x&&(t.x=this._viscousLimit(t.x,i.max.x)),t.y>i.max.y&&(t.y=this._viscousLimit(t.y,i.max.y)),this._draggable._newPos=this._draggable._startPos.add(t)}},_onPreDragWrap:function(){var t=this._worldWidth,i=Math.round(t/2),e=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-i+e)%t+i-e,s=(n+i+e)%t-i-e,r=Math.abs(o+e)i.getMaxZoom()&&1=i;)t=t.__parent;return this._currentShownBounds.contains(t.getLatLng())&&(this.options.animateAddingMarkers?this._animationAddLayer(e,t):this._animationAddLayerNonAnimated(e,t)),this},removeLayer:function(e){return e instanceof L.LayerGroup?this.removeLayers([e]):e.getLatLng?this._map?e.__parent?(this._unspiderfy&&(this._unspiderfy(),this._unspiderfyLayer(e)),this._removeLayer(e,!0),this._topClusterLevel._recalculateBounds(),e.off("move",this._childMarkerMoved,this),this._featureGroup.hasLayer(e)&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow()),this):this:(!this._arraySplice(this._needsClustering,e)&&this.hasLayer(e)&&this._needsRemoving.push(e),this):(this._nonPointGroup.removeLayer(e),this)},addLayers:function(e){if(!L.Util.isArray(e))return this.addLayer(e);var t,i=this._featureGroup,n=this._nonPointGroup,s=this.options.chunkedLoading,r=this.options.chunkInterval,o=this.options.chunkProgress,a=e.length,h=0,u=!0;if(this._map){var l=(new Date).getTime(),_=L.bind(function(){for(var d=(new Date).getTime();a>h;h++){if(s&&0===h%200){var c=(new Date).getTime()-d;if(c>r)break}if(t=e[h],t instanceof L.LayerGroup)u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(t,e),a=e.length;else if(t.getLatLng){if(!this.hasLayer(t)&&(this._addLayer(t,this._maxZoom),t.__parent&&2===t.__parent.getChildCount())){var p=t.__parent.getAllChildMarkers(),f=p[0]===t?p[1]:p[0];i.removeLayer(f)}}else n.addLayer(t)}o&&o(h,a,(new Date).getTime()-l),h===a?(this._topClusterLevel._recalculateBounds(),this._featureGroup.eachLayer(function(e){e instanceof L.MarkerCluster&&e._iconNeedsUpdate&&e._updateIcon()}),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds)):setTimeout(_,this.options.chunkDelay)},this);_()}else for(var d=this._needsClustering;a>h;h++)t=e[h],t instanceof L.LayerGroup?(u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(t,e),a=e.length):t.getLatLng?this.hasLayer(t)||d.push(t):n.addLayer(t);return this},removeLayers:function(e){var t,i,n=e.length,s=this._featureGroup,r=this._nonPointGroup,o=!0;if(!this._map){for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):(this._arraySplice(this._needsClustering,i),r.removeLayer(i),this.hasLayer(i)&&this._needsRemoving.push(i));return this}if(this._unspiderfy){this._unspiderfy();var a=e.slice(),h=n;for(t=0;h>t;t++)i=a[t],i instanceof L.LayerGroup?(this._extractNonGroupLayers(i,a),h=a.length):this._unspiderfyLayer(i)}for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):i.__parent?(this._removeLayer(i,!0,!0),s.hasLayer(i)&&(s.removeLayer(i),i.clusterShow&&i.clusterShow())):r.removeLayer(i);return this._topClusterLevel._recalculateBounds(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds),s.eachLayer(function(e){e instanceof L.MarkerCluster&&e._updateIcon()}),this},clearLayers:function(){return this._map||(this._needsClustering=[],delete this._gridClusters,delete this._gridUnclustered),this._noanimationUnspiderfy&&this._noanimationUnspiderfy(),this._featureGroup.clearLayers(),this._nonPointGroup.clearLayers(),this.eachLayer(function(e){e.off("move",this._childMarkerMoved,this),delete e.__parent}),this._map&&this._generateInitialClusters(),this},getBounds:function(){var e=new L.LatLngBounds;this._topClusterLevel&&e.extend(this._topClusterLevel._bounds);for(var t=this._needsClustering.length-1;t>=0;t--)e.extend(this._needsClustering[t].getLatLng());return e.extend(this._nonPointGroup.getBounds()),e},eachLayer:function(e,t){var i,n=this._needsClustering.slice(),s=this._needsRemoving;for(this._topClusterLevel&&this._topClusterLevel.getAllChildMarkers(n),i=n.length-1;i>=0;i--)-1===s.indexOf(n[i])&&e.call(t,n[i]);this._nonPointGroup.eachLayer(e,t)},getLayers:function(){var e=[];return this.eachLayer(function(t){e.push(t)}),e},getLayer:function(e){var t=null;return e=parseInt(e,10),this.eachLayer(function(i){L.stamp(i)===e&&(t=i)}),t},hasLayer:function(e){if(!e)return!1;var t,i=this._needsClustering;for(t=i.length-1;t>=0;t--)if(i[t]===e)return!0;for(i=this._needsRemoving,t=i.length-1;t>=0;t--)if(i[t]===e)return!1;return!(!e.__parent||e.__parent._group!==this)||this._nonPointGroup.hasLayer(e)},zoomToShowLayer:function(e,t){"function"!=typeof t&&(t=function(){});var i=function(){!e._icon&&!e.__parent._icon||this._inZoomAnimation||(this._map.off("moveend",i,this),this.off("animationend",i,this),e._icon?t():e.__parent._icon&&(this.once("spiderfied",t,this),e.__parent.spiderfy()))};if(e._icon&&this._map.getBounds().contains(e.getLatLng()))t();else if(e.__parent._zoomt;t++)n=this._needsRemoving[t],this._removeLayer(n,!0);this._needsRemoving=[],this._zoom=this._map.getZoom(),this._currentShownBounds=this._getExpandedVisibleBounds(),this._map.on("zoomend",this._zoomEnd,this),this._map.on("moveend",this._moveEnd,this),this._spiderfierOnAdd&&this._spiderfierOnAdd(),this._bindEvents(),i=this._needsClustering,this._needsClustering=[],this.addLayers(i)},onRemove:function(e){e.off("zoomend",this._zoomEnd,this),e.off("moveend",this._moveEnd,this),this._unbindEvents(),this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim",""),this._spiderfierOnRemove&&this._spiderfierOnRemove(),delete this._maxLat,this._hideCoverage(),this._featureGroup.remove(),this._nonPointGroup.remove(),this._featureGroup.clearLayers(),this._map=null},getVisibleParent:function(e){for(var t=e;t&&!t._icon;)t=t.__parent;return t||null},_arraySplice:function(e,t){for(var i=e.length-1;i>=0;i--)if(e[i]===t)return e.splice(i,1),!0},_removeFromGridUnclustered:function(e,t){for(var i=this._map,n=this._gridUnclustered;t>=0&&n[t].removeObject(e,i.project(e.getLatLng(),t));t--);},_childMarkerMoved:function(e){this._ignoreMove||(e.target._latlng=e.oldLatLng,this.removeLayer(e.target),e.target._latlng=e.latlng,this.addLayer(e.target))},_removeLayer:function(e,t,i){var n=this._gridClusters,s=this._gridUnclustered,r=this._featureGroup,o=this._map;t&&this._removeFromGridUnclustered(e,this._maxZoom);var a,h=e.__parent,u=h._markers;for(this._arraySplice(u,e);h&&(h._childCount--,h._boundsNeedUpdate=!0,!(h._zoom<0));)t&&h._childCount<=1?(a=h._markers[0]===e?h._markers[1]:h._markers[0],n[h._zoom].removeObject(h,o.project(h._cLatLng,h._zoom)),s[h._zoom].addObject(a,o.project(a.getLatLng(),h._zoom)),this._arraySplice(h.__parent._childClusters,h),h.__parent._markers.push(a),a.__parent=h.__parent,h._icon&&(r.removeLayer(h),i||r.addLayer(a))):i&&h._icon||h._updateIcon(),h=h.__parent;delete e.__parent},_isOrIsParent:function(e,t){for(;t;){if(e===t)return!0;t=t.parentNode}return!1},fire:function(e,t,i){if(t&&t.layer instanceof L.MarkerCluster){if(t.originalEvent&&this._isOrIsParent(t.layer._icon,t.originalEvent.relatedTarget))return;e="cluster"+e}L.FeatureGroup.prototype.fire.call(this,e,t,i)},listens:function(e,t){return L.FeatureGroup.prototype.listens.call(this,e,t)||L.FeatureGroup.prototype.listens.call(this,"cluster"+e,t)},_defaultIconCreateFunction:function(e){var t=e.getChildCount(),i=" marker-cluster-";return i+=10>t?"small":100>t?"medium":"large",new L.DivIcon({html:"
"+t+"
",className:"marker-cluster"+i,iconSize:new L.Point(40,40)})},_bindEvents:function(){var e=this._map,t=this.options.spiderfyOnMaxZoom,i=this.options.showCoverageOnHover,n=this.options.zoomToBoundsOnClick;(t||n)&&this.on("clusterclick",this._zoomOrSpiderfy,this),i&&(this.on("clustermouseover",this._showCoverage,this),this.on("clustermouseout",this._hideCoverage,this),e.on("zoomend",this._hideCoverage,this))},_zoomOrSpiderfy:function(e){for(var t=e.layer,i=t;1===i._childClusters.length;)i=i._childClusters[0];i._zoom===this._maxZoom&&i._childCount===t._childCount&&this.options.spiderfyOnMaxZoom?t.spiderfy():this.options.zoomToBoundsOnClick&&t.zoomToBounds(),e.originalEvent&&13===e.originalEvent.keyCode&&this._map._container.focus()},_showCoverage:function(e){var t=this._map;this._inZoomAnimation||(this._shownPolygon&&t.removeLayer(this._shownPolygon),e.layer.getChildCount()>2&&e.layer!==this._spiderfied&&(this._shownPolygon=new L.Polygon(e.layer.getConvexHull(),this.options.polygonOptions),t.addLayer(this._shownPolygon)))},_hideCoverage:function(){this._shownPolygon&&(this._map.removeLayer(this._shownPolygon),this._shownPolygon=null)},_unbindEvents:function(){var e=this.options.spiderfyOnMaxZoom,t=this.options.showCoverageOnHover,i=this.options.zoomToBoundsOnClick,n=this._map;(e||i)&&this.off("clusterclick",this._zoomOrSpiderfy,this),t&&(this.off("clustermouseover",this._showCoverage,this),this.off("clustermouseout",this._hideCoverage,this),n.off("zoomend",this._hideCoverage,this))},_zoomEnd:function(){this._map&&(this._mergeSplitClusters(),this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds())},_moveEnd:function(){if(!this._inZoomAnimation){var e=this._getExpandedVisibleBounds();this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,this._zoom,e),this._topClusterLevel._recursivelyAddChildrenToMap(null,Math.round(this._map._zoom),e),this._currentShownBounds=e}},_generateInitialClusters:function(){var e=this._map.getMaxZoom(),t=this.options.maxClusterRadius,i=t;"function"!=typeof t&&(i=function(){return t}),this.options.disableClusteringAtZoom&&(e=this.options.disableClusteringAtZoom-1),this._maxZoom=e,this._gridClusters={},this._gridUnclustered={};for(var n=e;n>=0;n--)this._gridClusters[n]=new L.DistanceGrid(i(n)),this._gridUnclustered[n]=new L.DistanceGrid(i(n));this._topClusterLevel=new this._markerCluster(this,-1)},_addLayer:function(e,t){var i,n,s=this._gridClusters,r=this._gridUnclustered;for(this.options.singleMarkerMode&&this._overrideMarkerIcon(e),e.on("move",this._childMarkerMoved,this);t>=0;t--){i=this._map.project(e.getLatLng(),t);var o=s[t].getNearObject(i);if(o)return o._addChild(e),e.__parent=o,void 0;if(o=r[t].getNearObject(i)){var a=o.__parent;a&&this._removeLayer(o,!1);var h=new this._markerCluster(this,t,o,e);s[t].addObject(h,this._map.project(h._cLatLng,t)),o.__parent=h,e.__parent=h;var u=h;for(n=t-1;n>a._zoom;n--)u=new this._markerCluster(this,n,u),s[n].addObject(u,this._map.project(o.getLatLng(),n));return a._addChild(u),this._removeFromGridUnclustered(o,t),void 0}r[t].addObject(e,i)}this._topClusterLevel._addChild(e),e.__parent=this._topClusterLevel},_enqueue:function(e){this._queue.push(e),this._queueTimeout||(this._queueTimeout=setTimeout(L.bind(this._processQueue,this),300))},_processQueue:function(){for(var e=0;ee?(this._animationStart(),this._animationZoomOut(this._zoom,e)):this._moveEnd()},_getExpandedVisibleBounds:function(){return this.options.removeOutsideVisibleBounds?L.Browser.mobile?this._checkBoundsMaxLat(this._map.getBounds()):this._checkBoundsMaxLat(this._map.getBounds().pad(1)):this._mapBoundsInfinite},_checkBoundsMaxLat:function(e){var t=this._maxLat;return t!==i&&(e.getNorth()>=t&&(e._northEast.lat=1/0),e.getSouth()<=-t&&(e._southWest.lat=-1/0)),e},_animationAddLayerNonAnimated:function(e,t){if(t===e)this._featureGroup.addLayer(e);else if(2===t._childCount){t._addToMap();var i=t.getAllChildMarkers();this._featureGroup.removeLayer(i[0]),this._featureGroup.removeLayer(i[1])}else t._updateIcon()},_extractNonGroupLayers:function(e,t){var i,n=e.getLayers(),s=0;for(t=t||[];s=0;i--)o=h[i],n.contains(o._latlng)||s.removeLayer(o)}),this._forceLayout(),this._topClusterLevel._recursivelyBecomeVisible(n,t),s.eachLayer(function(e){e instanceof L.MarkerCluster||!e._icon||e.clusterShow()}),this._topClusterLevel._recursively(n,e,t,function(e){e._recursivelyRestoreChildPositions(t)}),this._ignoreMove=!1,this._enqueue(function(){this._topClusterLevel._recursively(n,e,0,function(e){s.removeLayer(e),e.clusterShow()}),this._animationEnd()})},_animationZoomOut:function(e,t){this._animationZoomOutSingle(this._topClusterLevel,e-1,t),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,e,this._getExpandedVisibleBounds())},_animationAddLayer:function(e,t){var i=this,n=this._featureGroup;n.addLayer(e),t!==e&&(t._childCount>2?(t._updateIcon(),this._forceLayout(),this._animationStart(),e._setPos(this._map.latLngToLayerPoint(t.getLatLng())),e.clusterHide(),this._enqueue(function(){n.removeLayer(e),e.clusterShow(),i._animationEnd()})):(this._forceLayout(),i._animationStart(),i._animationZoomOutSingle(t,this._map.getMaxZoom(),this._map.getZoom())))}},_animationZoomOutSingle:function(e,t,i){var n=this._getExpandedVisibleBounds();e._recursivelyAnimateChildrenInAndAddSelfToMap(n,t+1,i);var s=this;this._forceLayout(),e._recursivelyBecomeVisible(n,i),this._enqueue(function(){if(1===e._childCount){var r=e._markers[0];this._ignoreMove=!0,r.setLatLng(r.getLatLng()),this._ignoreMove=!1,r.clusterShow&&r.clusterShow()}else e._recursively(n,i,0,function(e){e._recursivelyRemoveChildrenFromMap(n,t+1)});s._animationEnd()})},_animationEnd:function(){this._map&&(this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim","")),this._inZoomAnimation--,this.fire("animationend")},_forceLayout:function(){L.Util.falseFn(t.body.offsetWidth)}}),L.markerClusterGroup=function(e){return new L.MarkerClusterGroup(e)},L.MarkerCluster=L.Marker.extend({initialize:function(e,t,i,n){L.Marker.prototype.initialize.call(this,i?i._cLatLng||i.getLatLng():new L.LatLng(0,0),{icon:this}),this._group=e,this._zoom=t,this._markers=[],this._childClusters=[],this._childCount=0,this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._bounds=new L.LatLngBounds,i&&this._addChild(i),n&&this._addChild(n)},getAllChildMarkers:function(e){e=e||[];for(var t=this._childClusters.length-1;t>=0;t--)this._childClusters[t].getAllChildMarkers(e);for(var i=this._markers.length-1;i>=0;i--)e.push(this._markers[i]);return e},getChildCount:function(){return this._childCount},zoomToBounds:function(){for(var e,t=this._childClusters.slice(),i=this._group._map,n=i.getBoundsZoom(this._bounds),s=this._zoom+1,r=i.getZoom();t.length>0&&n>s;){s++;var o=[];for(e=0;es?this._group._map.setView(this._latlng,s):r>=n?this._group._map.setView(this._latlng,r+1):this._group._map.fitBounds(this._bounds)},getBounds:function(){var e=new L.LatLngBounds;return e.extend(this._bounds),e},_updateIcon:function(){this._iconNeedsUpdate=!0,this._icon&&this.setIcon(this)},createIcon:function(){return this._iconNeedsUpdate&&(this._iconObj=this._group.options.iconCreateFunction(this),this._iconNeedsUpdate=!1),this._iconObj.createIcon()},createShadow:function(){return this._iconObj.createShadow()},_addChild:function(e,t){this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._setClusterCenter(e),e instanceof L.MarkerCluster?(t||(this._childClusters.push(e),e.__parent=this),this._childCount+=e._childCount):(t||this._markers.push(e),this._childCount++),this.__parent&&this.__parent._addChild(e,!0)},_setClusterCenter:function(e){this._cLatLng||(this._cLatLng=e._cLatLng||e._latlng)},_resetBounds:function(){var e=this._bounds;e._southWest&&(e._southWest.lat=1/0,e._southWest.lng=1/0),e._northEast&&(e._northEast.lat=-1/0,e._northEast.lng=-1/0)},_recalculateBounds:function(){var e,t,i,n,s=this._markers,r=this._childClusters,o=0,a=0,h=this._childCount;if(0!==h){for(this._resetBounds(),e=0;e=0;i--)n=s[i],n._icon&&(n._setPos(t),n.clusterHide())},function(e){var i,n,s=e._childClusters;for(i=s.length-1;i>=0;i--)n=s[i],n._icon&&(n._setPos(t),n.clusterHide())})},_recursivelyAnimateChildrenInAndAddSelfToMap:function(e,t,i){this._recursively(e,i,0,function(n){n._recursivelyAnimateChildrenIn(e,n._group._map.latLngToLayerPoint(n.getLatLng()).round(),t),n._isSingleParent()&&t-1===i?(n.clusterShow(),n._recursivelyRemoveChildrenFromMap(e,t)):n.clusterHide(),n._addToMap()})},_recursivelyBecomeVisible:function(e,t){this._recursively(e,0,t,null,function(e){e.clusterShow()})},_recursivelyAddChildrenToMap:function(e,t,i){this._recursively(i,-1,t,function(n){if(t!==n._zoom)for(var s=n._markers.length-1;s>=0;s--){var r=n._markers[s];i.contains(r._latlng)&&(e&&(r._backupLatlng=r.getLatLng(),r.setLatLng(e),r.clusterHide&&r.clusterHide()),n._group._featureGroup.addLayer(r))}},function(t){t._addToMap(e)})},_recursivelyRestoreChildPositions:function(e){for(var t=this._markers.length-1;t>=0;t--){var i=this._markers[t];i._backupLatlng&&(i.setLatLng(i._backupLatlng),delete i._backupLatlng)}if(e-1===this._zoom)for(var n=this._childClusters.length-1;n>=0;n--)this._childClusters[n]._restorePosition();else for(var s=this._childClusters.length-1;s>=0;s--)this._childClusters[s]._recursivelyRestoreChildPositions(e)},_restorePosition:function(){this._backupLatlng&&(this.setLatLng(this._backupLatlng),delete this._backupLatlng)},_recursivelyRemoveChildrenFromMap:function(e,t,i){var n,s;this._recursively(e,-1,t-1,function(e){for(s=e._markers.length-1;s>=0;s--)n=e._markers[s],i&&i.contains(n._latlng)||(e._group._featureGroup.removeLayer(n),n.clusterShow&&n.clusterShow())},function(e){for(s=e._childClusters.length-1;s>=0;s--)n=e._childClusters[s],i&&i.contains(n._latlng)||(e._group._featureGroup.removeLayer(n),n.clusterShow&&n.clusterShow())})},_recursively:function(e,t,i,n,s){var r,o,a=this._childClusters,h=this._zoom;if(t>h)for(r=a.length-1;r>=0;r--)o=a[r],e.intersects(o._bounds)&&o._recursively(e,t,i,n,s);else if(n&&n(this),s&&this._zoom===i&&s(this),i>h)for(r=a.length-1;r>=0;r--)o=a[r],e.intersects(o._bounds)&&o._recursively(e,t,i,n,s)},_isSingleParent:function(){return this._childClusters.length>0&&this._childClusters[0]._childCount===this._childCount}}),L.Marker.include({clusterHide:function(){return this.options.opacityWhenUnclustered=this.options.opacity||1,this.setOpacity(0)},clusterShow:function(){var e=this.setOpacity(this.options.opacity||this.options.opacityWhenUnclustered);return delete this.options.opacityWhenUnclustered,e}}),L.DistanceGrid=function(e){this._cellSize=e,this._sqCellSize=e*e,this._grid={},this._objectPoint={}},L.DistanceGrid.prototype={addObject:function(e,t){var i=this._getCoord(t.x),n=this._getCoord(t.y),s=this._grid,r=s[n]=s[n]||{},o=r[i]=r[i]||[],a=L.Util.stamp(e);this._objectPoint[a]=t,o.push(e)},updateObject:function(e,t){this.removeObject(e),this.addObject(e,t)},removeObject:function(e,t){var i,n,s=this._getCoord(t.x),r=this._getCoord(t.y),o=this._grid,a=o[r]=o[r]||{},h=a[s]=a[s]||[];for(delete this._objectPoint[L.Util.stamp(e)],i=0,n=h.length;n>i;i++)if(h[i]===e)return h.splice(i,1),1===n&&delete a[s],!0},eachObject:function(e,t){var i,n,s,r,o,a,h,u=this._grid;for(i in u){o=u[i];for(n in o)for(a=o[n],s=0,r=a.length;r>s;s++)h=e.call(t,a[s]),h&&(s--,r--)}},getNearObject:function(e){var t,i,n,s,r,o,a,h,u=this._getCoord(e.x),l=this._getCoord(e.y),_=this._objectPoint,d=this._sqCellSize,c=null;for(t=l-1;l+1>=t;t++)if(s=this._grid[t])for(i=u-1;u+1>=i;i++)if(r=s[i])for(n=0,o=r.length;o>n;n++)a=r[n],h=this._sqDist(_[L.Util.stamp(a)],e),d>h&&(d=h,c=a);return c},_getCoord:function(e){return Math.floor(e/this._cellSize)},_sqDist:function(e,t){var i=t.x-e.x,n=t.y-e.y;return i*i+n*n}},function(){L.QuickHull={getDistant:function(e,t){var i=t[1].lat-t[0].lat,n=t[0].lng-t[1].lng;return n*(e.lat-t[0].lat)+i*(e.lng-t[0].lng)},findMostDistantPointFromBaseLine:function(e,t){var i,n,s,r=0,o=null,a=[];for(i=t.length-1;i>=0;i--)n=t[i],s=this.getDistant(n,e),s>0&&(a.push(n),s>r&&(r=s,o=n));return{maxPoint:o,newPoints:a}},buildConvexHull:function(e,t){var i=[],n=this.findMostDistantPointFromBaseLine(e,t);return n.maxPoint?(i=i.concat(this.buildConvexHull([e[0],n.maxPoint],n.newPoints)),i=i.concat(this.buildConvexHull([n.maxPoint,e[1]],n.newPoints))):[e[0]]},getConvexHull:function(e){var t,i=!1,n=!1,s=!1,r=!1,o=null,a=null,h=null,u=null,l=null,_=null;for(t=e.length-1;t>=0;t--){var d=e[t];(i===!1||d.lat>i)&&(o=d,i=d.lat),(n===!1||d.lats)&&(h=d,s=d.lng),(r===!1||d.lng=0;t--)e=i[t].getLatLng(),n.push(e);return L.QuickHull.getConvexHull(n)}}),L.MarkerCluster.include({_2PI:2*Math.PI,_circleFootSeparation:25,_circleStartAngle:Math.PI/6,_spiralFootSeparation:28,_spiralLengthStart:11,_spiralLengthFactor:5,_circleSpiralSwitchover:9,spiderfy:function(){if(this._group._spiderfied!==this&&!this._group._inZoomAnimation){var e,t=this.getAllChildMarkers(),i=this._group,n=i._map,s=n.latLngToLayerPoint(this._latlng);this._group._unspiderfy(),this._group._spiderfied=this,t.length>=this._circleSpiralSwitchover?e=this._generatePointsSpiral(t.length,s):(s.y+=10,e=this._generatePointsCircle(t.length,s)),this._animationSpiderfy(t,e)}},unspiderfy:function(e){this._group._inZoomAnimation||(this._animationUnspiderfy(e),this._group._spiderfied=null)},_generatePointsCircle:function(e,t){var i,n,s=this._group.options.spiderfyDistanceMultiplier*this._circleFootSeparation*(2+e),r=s/this._2PI,o=this._2PI/e,a=[];for(a.length=e,i=e-1;i>=0;i--)n=this._circleStartAngle+i*o,a[i]=new L.Point(t.x+r*Math.cos(n),t.y+r*Math.sin(n))._round();return a},_generatePointsSpiral:function(e,t){var i,n=this._group.options.spiderfyDistanceMultiplier,s=n*this._spiralLengthStart,r=n*this._spiralFootSeparation,o=n*this._spiralLengthFactor*this._2PI,a=0,h=[];for(h.length=e,i=e-1;i>=0;i--)a+=r/s+5e-4*i,h[i]=new L.Point(t.x+s*Math.cos(a),t.y+s*Math.sin(a))._round(),s+=o/a;return h},_noanimationUnspiderfy:function(){var e,t,i=this._group,n=i._map,s=i._featureGroup,r=this.getAllChildMarkers();for(i._ignoreMove=!0,this.setOpacity(1),t=r.length-1;t>=0;t--)e=r[t],s.removeLayer(e),e._preSpiderfyLatlng&&(e.setLatLng(e._preSpiderfyLatlng),delete e._preSpiderfyLatlng),e.setZIndexOffset&&e.setZIndexOffset(0),e._spiderLeg&&(n.removeLayer(e._spiderLeg),delete e._spiderLeg);i.fire("unspiderfied",{cluster:this,markers:r}),i._ignoreMove=!1,i._spiderfied=null}}),L.MarkerClusterNonAnimated=L.MarkerCluster.extend({_animationSpiderfy:function(e,t){var i,n,s,r,o=this._group,a=o._map,h=o._featureGroup,u=this._group.options.spiderLegPolylineOptions;for(o._ignoreMove=!0,i=0;i=0;n--)h=_.layerPointToLatLng(t[n]),s=e[n],s._preSpiderfyLatlng=s._latlng,s.setLatLng(h),s.clusterShow&&s.clusterShow(),f&&(r=s._spiderLeg,o=r._path,o.style.strokeDashoffset=0,r.setStyle({opacity:g}));this.setOpacity(.3),l._ignoreMove=!1,setTimeout(function(){l._animationEnd(),l.fire("spiderfied",{cluster:u,markers:e})},200)},_animationUnspiderfy:function(e){var t,i,n,s,r,o,a=this,h=this._group,u=h._map,l=h._featureGroup,_=e?u._latLngToNewLayerPoint(this._latlng,e.zoom,e.center):u.latLngToLayerPoint(this._latlng),d=this.getAllChildMarkers(),c=L.Path.SVG;for(h._ignoreMove=!0,h._animationStart(),this.setOpacity(1),i=d.length-1;i>=0;i--)t=d[i],t._preSpiderfyLatlng&&(t.setLatLng(t._preSpiderfyLatlng),delete t._preSpiderfyLatlng,o=!0,t._setPos&&(t._setPos(_),o=!1),t.clusterHide&&(t.clusterHide(),o=!1),o&&l.removeLayer(t),c&&(n=t._spiderLeg,s=n._path,r=s.getTotalLength()+.1,s.style.strokeDashoffset=r,n.setStyle({opacity:0})));h._ignoreMove=!1,setTimeout(function(){var e=0;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&e++;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&(t.clusterShow&&t.clusterShow(),t.setZIndexOffset&&t.setZIndexOffset(0),e>1&&l.removeLayer(t),u.removeLayer(t._spiderLeg),delete t._spiderLeg);h._animationEnd(),h.fire("unspiderfied",{cluster:a,markers:d})},200)}}),L.MarkerClusterGroup.include({_spiderfied:null,unspiderfy:function(){this._unspiderfy.apply(this,arguments)},_spiderfierOnAdd:function(){this._map.on("click",this._unspiderfyWrapper,this),this._map.options.zoomAnimation&&this._map.on("zoomstart",this._unspiderfyZoomStart,this),this._map.on("zoomend",this._noanimationUnspiderfy,this),L.Browser.touch||this._map.getRenderer(this)},_spiderfierOnRemove:function(){this._map.off("click",this._unspiderfyWrapper,this),this._map.off("zoomstart",this._unspiderfyZoomStart,this),this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._map.off("zoomend",this._noanimationUnspiderfy,this),this._noanimationUnspiderfy()},_unspiderfyZoomStart:function(){this._map&&this._map.on("zoomanim",this._unspiderfyZoomAnim,this)},_unspiderfyZoomAnim:function(e){L.DomUtil.hasClass(this._map._mapPane,"leaflet-touching")||(this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._unspiderfy(e))},_unspiderfyWrapper:function(){this._unspiderfy()},_unspiderfy:function(e){this._spiderfied&&this._spiderfied.unspiderfy(e)},_noanimationUnspiderfy:function(){this._spiderfied&&this._spiderfied._noanimationUnspiderfy()},_unspiderfyLayer:function(e){e._spiderLeg&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow(),e.setZIndexOffset&&e.setZIndexOffset(0),this._map.removeLayer(e._spiderLeg),delete e._spiderLeg)}}),L.MarkerClusterGroup.include({refreshClusters:function(e){return e?e instanceof L.MarkerClusterGroup?e=e._topClusterLevel.getAllChildMarkers():e instanceof L.LayerGroup?e=e._layers:e instanceof L.MarkerCluster?e=e.getAllChildMarkers():e instanceof L.Marker&&(e=[e]):e=this._topClusterLevel.getAllChildMarkers(),this._flagParentsIconsNeedUpdate(e),this._refreshClustersIcons(),this.options.singleMarkerMode&&this._refreshSingleMarkerModeMarkers(e),this},_flagParentsIconsNeedUpdate:function(e){var t,i;for(t in e)for(i=e[t].__parent;i;)i._iconNeedsUpdate=!0,i=i.__parent},_refreshClustersIcons:function(){this._featureGroup.eachLayer(function(e){e instanceof L.MarkerCluster&&e._iconNeedsUpdate&&e._updateIcon()})},_refreshSingleMarkerModeMarkers:function(e){var t,i;for(t in e)i=e[t],this.hasLayer(i)&&i.setIcon(this._overrideMarkerIcon(i))}}),L.Marker.include({refreshIconOptions:function(e,t){var i=this.options.icon;return L.setOptions(i,e),this.setIcon(i),t&&this.__parent&&this.__parent._group.refreshClusters(this),this}})}(window,document); \ No newline at end of file diff --git a/js/leaflet.pattern.js b/js/leaflet.pattern.js new file mode 100644 index 0000000..d08c185 --- /dev/null +++ b/js/leaflet.pattern.js @@ -0,0 +1,6 @@ +/* + Leaflet.pattern, Provides tools to set the backgrounds of vector shapes in Leaflet to be patterns. + https://github.com/teastman/Leaflet.pattern + (c) 2015, Tyler Eastman +*/ +!function(t,e){L.Pattern=L.Class.extend({includes:[L.Mixin.Events],options:{x:0,y:0,width:8,height:8,patternUnits:"userSpaceOnUse",patternContentUnits:"userSpaceOnUse"},_addShapes:L.Util.falseFn,_update:L.Util.falseFn,initialize:function(t){this._shapes={},L.setOptions(this,t)},onAdd:function(t){this._map=t.target?t.target:t,this._map._initDefRoot(),this._initDom();for(var e in this._shapes)this._shapes[e].onAdd(this);this._addShapes(),this._addDom(),this.redraw(),this.getEvents&&this._map.on(this.getEvents(),this),this.fire("add"),this._map.fire("patternadd",{pattern:this})},onRemove:function(){this._removeDom()},redraw:function(){if(this._map){this._update();for(var t in this._shapes)this._shapes[t].redraw()}return this},setStyle:function(t){return L.setOptions(this,t),this._map&&(this._updateStyle(),this.redraw()),this},addTo:function(t){return t.addPattern(this),this},remove:function(){return this.removeFrom(this._map)},removeFrom:function(t){return t&&t.removePattern(this),this}}),L.Map.addInitHook(function(){this._patterns={}}),L.Map.include({addPattern:function(t){var e=L.stamp(t);return this._patterns[e]?t:(this._patterns[e]=t,this.whenReady(t.onAdd,t),this)},removePattern:function(t){var e=L.stamp(t);return this._patterns[e]?(this._loaded&&t.onRemove(this),t.getEvents&&this.off(t.getEvents(),t),delete this._patterns[e],this._loaded&&(this.fire("patternremove",{pattern:t}),t.fire("remove")),t._map=null,this):this},hasPattern:function(t){return!!t&&L.stamp(t)in this._patterns}}),L.Pattern.SVG_NS="http://www.w3.org/2000/svg",L.Pattern=L.Pattern.extend({_createElement:function(t){return e.createElementNS(L.Pattern.SVG_NS,t)},_initDom:function(){this._dom=this._createElement("pattern"),this.options.className&&L.DomUtil.addClass(this._dom,this.options.className),this._updateStyle()},_addDom:function(){this._map._defRoot.appendChild(this._dom)},_removeDom:function(){L.DomUtil.remove(this._dom)},_updateStyle:function(){var t=this._dom,e=this.options;if(t){if(t.setAttribute("id",L.stamp(this)),t.setAttribute("x",e.x),t.setAttribute("y",e.y),t.setAttribute("width",e.width),t.setAttribute("height",e.height),t.setAttribute("patternUnits",e.patternUnits),t.setAttribute("patternContentUnits",e.patternContentUnits),e.patternTransform||e.angle){var i=e.patternTransform?e.patternTransform+" ":"";i+=e.angle?"rotate("+e.angle+") ":"",t.setAttribute("patternTransform",i)}else t.removeAttribute("patternTransform");for(var s in this._shapes)this._shapes[s]._updateStyle()}}}),L.Map.include({_initDefRoot:function(){if(!this._defRoot)if("function"==typeof this.getRenderer){var t=this.getRenderer(this);this._defRoot=L.Pattern.prototype._createElement("defs"),t._container.appendChild(this._defRoot)}else this._pathRoot||this._initPathRoot(),this._defRoot=L.Pattern.prototype._createElement("defs"),this._pathRoot.appendChild(this._defRoot)}}),L.SVG?L.SVG.include({_superUpdateStyle:L.SVG.prototype._updateStyle,_updateStyle:function(t){this._superUpdateStyle(t),t.options.fill&&t.options.fillPattern&&t._path.setAttribute("fill","url(#"+L.stamp(t.options.fillPattern)+")")}}):L.Path.include({_superUpdateStyle:L.Path.prototype._updateStyle,_updateStyle:function(){this._superUpdateStyle(),this.options.fill&&this.options.fillPattern&&this._path.setAttribute("fill","url(#"+L.stamp(this.options.fillPattern)+")")}}),L.StripePattern=L.Pattern.extend({options:{weight:4,spaceWeight:4,color:"#000000",spaceColor:"#ffffff",opacity:1,spaceOpacity:0},_addShapes:function(){this._stripe=new L.PatternPath({stroke:!0,weight:this.options.weight,color:this.options.color,opacity:this.options.opacity}),this._space=new L.PatternPath({stroke:!0,weight:this.options.spaceWeight,color:this.options.spaceColor,opacity:this.options.spaceOpacity}),this.addShape(this._stripe),this.addShape(this._space),this._update()},_update:function(){this._stripe.options.d="M0 "+this._stripe.options.weight/2+" H "+this.options.width,this._space.options.d="M0 "+(this._stripe.options.weight+this._space.options.weight/2)+" H "+this.options.width},setStyle:L.Pattern.prototype.setStyle}),L.stripePattern=function(t){return new L.StripePattern(t)},L.PatternShape=L.Class.extend({options:{stroke:!0,color:"#3388ff",weight:3,opacity:1,lineCap:"round",lineJoin:"round",fillOpacity:.2,fillRule:"evenodd"},initialize:function(t){L.setOptions(this,t)},onAdd:function(t){this._pattern=t,this._pattern._dom&&(this._initDom(),this._addDom())},addTo:function(t){return t.addShape(this),this},redraw:function(){return this._pattern&&this._updateShape(),this},setStyle:function(t){return L.setOptions(this,t),this._pattern&&this._updateStyle(),this},setShape:function(t){this.options=L.extend({},this.options,t),this._updateShape()}}),L.Pattern.include({addShape:function(t){var e=L.stamp(t);return this._shapes[e]?t:(this._shapes[e]=t,t.onAdd(this),void 0)}}),L.PatternShape.SVG_NS="http://www.w3.org/2000/svg",L.PatternShape=L.PatternShape.extend({_createElement:function(t){return e.createElementNS(L.PatternShape.SVG_NS,t)},_initDom:L.Util.falseFn,_updateShape:L.Util.falseFn,_initDomElement:function(t){this._dom=this._createElement(t),this.options.className&&L.DomUtil.addClass(this._dom,this.options.className),this._updateStyle()},_addDom:function(){this._pattern._dom.appendChild(this._dom)},_updateStyle:function(){var t=this._dom,e=this.options;t&&(e.stroke?(t.setAttribute("stroke",e.color),t.setAttribute("stroke-opacity",e.opacity),t.setAttribute("stroke-width",e.weight),t.setAttribute("stroke-linecap",e.lineCap),t.setAttribute("stroke-linejoin",e.lineJoin),e.dashArray?t.setAttribute("stroke-dasharray",e.dashArray):t.removeAttribute("stroke-dasharray"),e.dashOffset?t.setAttribute("stroke-dashoffset",e.dashOffset):t.removeAttribute("stroke-dashoffset")):t.setAttribute("stroke","none"),e.fill?(e.fillPattern?t.setAttribute("fill","url(#"+L.stamp(e.fillPattern)+")"):t.setAttribute("fill",e.fillColor||e.color),t.setAttribute("fill-opacity",e.fillOpacity),t.setAttribute("fill-rule",e.fillRule||"evenodd")):t.setAttribute("fill","none"),t.setAttribute("pointer-events",e.pointerEvents||(e.interactive?"visiblePainted":"none")))}}),L.PatternPath=L.PatternShape.extend({_initDom:function(){this._initDomElement("path")},_updateShape:function(){this._dom&&this._dom.setAttribute("d",this.options.d)}}),L.PatternCircle=L.PatternShape.extend({options:{x:0,y:0,radius:0},_initDom:function(){this._initDomElement("circle")},_updateShape:function(){this._dom&&(this._dom.setAttribute("cx",this.options.x),this._dom.setAttribute("cy",this.options.y),this._dom.setAttribute("r",this.options.radius))}}),L.PatternRect=L.PatternShape.extend({options:{x:0,y:0,width:10,height:10},_initDom:function(){this._initDomElement("rect")},_updateShape:function(){this._dom&&(this._dom.setAttribute("x",this.options.x),this._dom.setAttribute("y",this.options.y),this._dom.setAttribute("width",this.options.width),this._dom.setAttribute("height",this.options.height),this.options.rx&&this._dom.setAttribute("rx",this.options.rx),this.options.ry&&this._dom.setAttribute("ry",this.options.ry))}})}(window,document); \ No newline at end of file diff --git a/js/leaflet.rotatedMarker.js b/js/leaflet.rotatedMarker.js new file mode 100644 index 0000000..9d9be5a --- /dev/null +++ b/js/leaflet.rotatedMarker.js @@ -0,0 +1,51 @@ +(function() { + // save these original methods before they are overwritten + var proto_initIcon = L.Marker.prototype._initIcon; + var proto_setPos = L.Marker.prototype._setPos; + + var oldIE = (L.DomUtil.TRANSFORM === 'msTransform'); + + L.Marker.addInitHook(function () { + var iconOptions = this.options.icon && this.options.icon.options; + var iconAnchor = iconOptions && this.options.icon.options.iconAnchor; + if (iconAnchor) { + iconAnchor = (iconAnchor[0] + 'px ' + iconAnchor[1] + 'px'); + } + this.options.rotationOrigin = this.options.rotationOrigin || iconAnchor || 'center bottom' ; + this.options.rotationAngle = this.options.rotationAngle || 0; + }); + + L.Marker.include({ + _initIcon: function() { + proto_initIcon.call(this); + }, + + _setPos: function (pos) { + proto_setPos.call(this, pos); + + if(this.options.rotationAngle) { + this._icon.style[L.DomUtil.TRANSFORM+'Origin'] = this.options.rotationOrigin; + + if(oldIE) { + // for IE 9, use the 2D rotation + this._icon.style[L.DomUtil.TRANSFORM] = 'rotate(' + this.options.rotationAngle + 'deg)'; + } else { + // for modern browsers, prefer the 3D accelerated version + this._icon.style[L.DomUtil.TRANSFORM] += ' rotateZ(' + this.options.rotationAngle + 'deg)'; + } + } + }, + + setRotationAngle: function(angle) { + this.options.rotationAngle = angle; + this.update(); + return this; + }, + + setRotationOrigin: function(origin) { + this.options.rotationOrigin = origin; + this.update(); + return this; + } + }); +})(); diff --git a/js/leaflet.wms.js b/js/leaflet.wms.js new file mode 100644 index 0000000..e234ff6 --- /dev/null +++ b/js/leaflet.wms.js @@ -0,0 +1,495 @@ +/*! + * leaflet.wms.js + * A collection of Leaflet utilities for working with Web Mapping services. + * (c) 2014-2016, Houston Engineering, Inc. + * MIT License + */ + +(function (factory) { + // Module systems magic dance, Leaflet edition + if (typeof define === 'function' && define.amd) { + // AMD + define(['leaflet'], factory); + } else if (typeof module !== 'undefined') { + // Node/CommonJS + module.exports = factory(require('leaflet')); + } else { + // Browser globals + if (typeof this.L === 'undefined') + throw 'Leaflet must be loaded first!'; + // Namespace + this.L.WMS = this.L.wms = factory(this.L); + } +}(function (L) { + +// Module object +var wms = {}; + +// Quick shim for Object.keys() +if (!('keys' in Object)) { + Object.keys = function(obj) { + var result = []; + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + result.push(i); + } + } + return result; + }; +} + +/* + * wms.Source + * The Source object manages a single WMS connection. Multiple "layers" can be + * created with the getLayer function, but a single request will be sent for + * each image update. Can be used in non-tiled "overlay" mode (default), or + * tiled mode, via an internal wms.Overlay or wms.TileLayer, respectively. + */ +wms.Source = L.Layer.extend({ + 'options': { + 'untiled': true, + 'identify': true + }, + + 'initialize': function(url, options) { + L.setOptions(this, options); + if (this.options.tiled) { + this.options.untiled = false; + } + this._url = url; + this._subLayers = {}; + this._overlay = this.createOverlay(this.options.untiled); + }, + + 'createOverlay': function(untiled) { + // Create overlay with all options other than untiled & identify + var overlayOptions = {}; + for (var opt in this.options) { + if (opt != 'untiled' && opt != 'identify') { + overlayOptions[opt] = this.options[opt]; + } + } + if (untiled) { + return wms.overlay(this._url, overlayOptions); + } else { + return wms.tileLayer(this._url, overlayOptions); + } + }, + + 'onAdd': function() { + this.refreshOverlay(); + }, + + 'getEvents': function() { + if (this.options.identify) { + return {'click': this.identify}; + } else { + return {}; + } + }, + + 'setOpacity': function(opacity) { + this.options.opacity = opacity; + if (this._overlay) { + this._overlay.setOpacity(opacity); + } + }, + + 'bringToBack': function() { + this.options.isBack = true; + if (this._overlay) { + this._overlay.bringToBack(); + } + }, + + 'bringToFront': function() { + this.options.isBack = false; + if (this._overlay) { + this._overlay.bringToFront(); + } + }, + + 'getLayer': function(name) { + return wms.layer(this, name); + }, + + 'addSubLayer': function(name) { + this._subLayers[name] = true; + this.refreshOverlay(); + }, + + 'removeSubLayer': function(name) { + delete this._subLayers[name]; + this.refreshOverlay(); + }, + + 'refreshOverlay': function() { + var subLayers = Object.keys(this._subLayers).join(","); + if (!this._map) { + return; + } + if (!subLayers) { + this._overlay.remove(); + } else { + this._overlay.setParams({'layers': subLayers}); + this._overlay.addTo(this._map); + } + }, + + 'identify': function(evt) { + // Identify map features in response to map clicks. To customize this + // behavior, create a class extending wms.Source and override one or + // more of the following hook functions. + + var layers = this.getIdentifyLayers(); + if (!layers.length) { + return; + } + this.getFeatureInfo( + evt.containerPoint, evt.latlng, layers, + this.showFeatureInfo + ); + }, + + 'getFeatureInfo': function(point, latlng, layers, callback) { + // Request WMS GetFeatureInfo and call callback with results + // (split from identify() to faciliate use outside of map events) + var params = this.getFeatureInfoParams(point, layers), + url = this._url + L.Util.getParamString(params, this._url); + + this.showWaiting(); + this.ajax(url, done); + + function done(result) { + this.hideWaiting(); + var text = this.parseFeatureInfo(result, url); + callback.call(this, latlng, text); + } + }, + + 'ajax': function(url, callback) { + ajax.call(this, url, callback); + }, + + 'getIdentifyLayers': function() { + // Hook to determine which layers to identify + if (this.options.identifyLayers) + return this.options.identifyLayers; + return Object.keys(this._subLayers); + }, + + 'getFeatureInfoParams': function(point, layers) { + // Hook to generate parameters for WMS service GetFeatureInfo request + var wmsParams, overlay; + if (this.options.untiled) { + // Use existing overlay + wmsParams = this._overlay.wmsParams; + } else { + // Create overlay instance to leverage updateWmsParams + overlay = this.createOverlay(true); + overlay.updateWmsParams(this._map); + wmsParams = overlay.wmsParams; + wmsParams.layers = layers.join(','); + } + var infoParams = { + 'request': 'GetFeatureInfo', + 'query_layers': layers.join(','), + 'X': Math.round(point.x), + 'Y': Math.round(point.y) + }; + return L.extend({}, wmsParams, infoParams); + }, + + 'parseFeatureInfo': function(result, url) { + // Hook to handle parsing AJAX response + if (result == "error") { + // AJAX failed, possibly due to CORS issues. + // Try loading content in